10
votes

Quelque chose dans les goûts d'ilist.indexof () mais sur iEnumerable ?

existe-t-il une méthode de méthode / extension sur iEnumerable qui me permet de trouver l'index de l'instance d'objet? Comme indexofof () dans IList?

indexPosition = myEnumerable.IndexOf() ?


0 commentaires

3 Réponses :


3
votes

Méthodes d'extension pour une partie énumérable II - Injection d'indexation et index Extraction http://chawhatwow.blogspot.com/2008/05/extension-methods-for-enumerer-par.html


0 commentaires

10
votes

un ienumerable code> n'est pas un ensemble commandé.
Bien que la plupart des inumérables soient commandés, certains (tels que dictionnaire code> ou hashset code>) ne sont pas.

Par conséquent, LINQ n'a pas de méthode code> code> . P>

Cependant, vous pouvez en écrire un vous-même: P>

///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="predicate">The expression to test the items against.</param>
///<returns>The index of the first matching item, or -1 if no items match.</returns>
public static int FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) {
    if (items == null) throw new ArgumentNullException("items");
    if (predicate == null) throw new ArgumentNullException("predicate");

    int retVal = 0;
    foreach (var item in items) {
        if (predicate(item)) return retVal;
        retVal++;
    }
    return -1;
}
///<summary>Finds the index of the first occurence of an item in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="item">The item to find.</param>
///<returns>The index of the first matching item, or -1 if the item was not found.</returns>
public static int IndexOf<T>(this IEnumerable<T> items, T item) { return items.FindIndex(i => EqualityComparer<T>.Default.Equals(item, i)); }


3 commentaires

Hmm, mais si vous dites que ce n'est pas un ensemble ordonné, je ne devrais-je pas utiliser un IList quand je veux quelque chose qui est censé être commandé? Il me semble que l'utilisation d'iEnumerable puisse alors ré-implémenter la roue est un peu maladroite.


Oui, vous devez utiliser un IList .


Si le fait que ienumerable n'est pas toujours commandé a motivé l'absence d'une méthode d'extension d'index de , pourquoi avons-nous élématat ?



1
votes

Notez qu'il ne pouvait y avoir aucune méthode d'instance car ienumerable est covariant.

Tout de type iEnumerable doit mettre en œuvre indexofof (chaîne x) et, en raison de la covariance, peut être cassette sur ienumerable .

alors il expose désormais comme indexof (objet x) Qu'est-ce qui est vraiment indexof (chaîne x) , et puisque tous les objets sont sont < Code> Strings , ne pouvait pas fonctionner pour tous les objets.

ilist peut le faire car il est invariant, c'est-à-dire que vous ne pouvez pas lancer un iList à un iList .


0 commentaires