Je ne peux pas donner de sens à la documentation MSDN pour cette surcharge de la méthode Where qui accepte un prédicat qui a deux arguments où l'int, soi-disant, représente l'index de l'élément source, peu importe ce que cela signifie (je pensais qu'une énumérable était une séquence et que vous ne pouviez pas voir plus loin que l'élément suivant, encore moins indexer). Est-ce que quelqu'un peut expliquer comment utiliser cette surcharge et en particulier à quoi sert cet int dans Func et comment il est utilisé?S'il vous plaît expliquer System.Linq.Enumerable.Where (Func <T, int, bool> prédicat)
Répondre
Le paramètre int
représente l'index de l'élément en cours dans l'itération en cours. Chaque fois que vous appelez l'une des méthodes d'extension LINQ, vous n'êtes pas en théorie assuré d'obtenir les éléments retournés dans le même ordre, mais vous savez qu'ils sont tous retournés une fois chacun et que des indices peuvent leur être attribués. (Eh bien, vous êtes assuré si vous connaissez l'objet de requête est un List<T>
ou tel, mais pas en général.)
Exemple:
var result1 = myEnumerable.Where((item, index) => index < 4);
var result2 = myEnumerable.Take(4);
// result1 and result2 are equivalent.
Un grand merci pour la bonne explication, Noldorin. Vous faites une observation intéressante. Dans quels cas ne seriez-vous pas certain de l'ordre dans lequel les articles sont retournés? Pourriez-vous élaborer là-dessus? –
Vous ne pouvez pas indexer un IEnumerable<T>
de la même manière, vous pouvez un tableau, mais vous pourrez peut-être utiliser l'index pour filtrer la liste d'une manière ou d'une autre, ou éventuellement indexer des données dans une autre collection qui sera utilisée dans la condition.
EDIT: A titre d'exemple, pour ignorer tous les autres éléments que vous pouvez utiliser:
var results = sequence.Where((item, idx) => idx % 2 == 0);
Merci, Lee. Bien sûr, je comprends maintenant, mais pour moi personnellement, cela ne semble pas très intuitif. Je ne sais pas quoi, mais quelque chose semble aller de travers avec cette interface. –
Celui-ci? http://msdn.microsoft.com/fr-fr/library/bb549418.aspx – Rup
Merci, Rup. Je comprends maintenant, mais quelque chose en moi rejette ce genre d'interface. Je ne peux pas sembler tenir l'index et la séquence dans la même phrase. Mais le lien que vous avez offert a répondu à ma question en ce sens qu'il m'a appris comment utiliser la méthode, donc, merci beaucoup. –