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() ?
3 Réponses :
Méthodes d'extension pour une partie énumérable II - Injection d'indexation et index Extraction forte> http://chawhatwow.blogspot.com/2008/05/extension-methods-for-enumerer-par.html P>
un Par conséquent, LINQ n'a pas de méthode code> code> . P> Cependant, vous pouvez en écrire un vous-même: P> 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.
///<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)); }
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 code> n'est pas toujours commandé a motivé l'absence d'une méthode d'extension code> d'index de code>, pourquoi avons-nous
élématat code>?
Notez qu'il ne pouvait y avoir aucune méthode d'instance car Tout de type alors il expose désormais comme ienumerable code> est covariant. P>
iEnumerable
indexofof (chaîne x) code> et, en raison de la covariance, peut être cassette sur
ienumerable
indexof (objet x) code> Qu'est-ce qui est vraiment
indexof (chaîne x) code>, et puisque tous les objets code> sont code> sont < Code> Strings code>, ne pouvait pas fonctionner pour tous les objets. P>
ilist code> peut le faire car il est invariant, c'est-à-dire que vous ne pouvez pas lancer un
iList
iList