8
votes

LINQ équivalent de la liste .Find ()?

Je cherche un code qui prend un ienumerable code> et la convertit en un Liste code> Donc, il peut utiliser Liste .Find (prédicat) code> :

var myEnumerable = ...;
var myList = new List<T>(myEnumerable);
var match = myList.Find(value => value.Aaa == aaa && value.Bbb == bbb);


0 commentaires

3 Réponses :


10
votes

2 commentaires

C'est ce que je soupçonnais, mais c'est bon d'entendre la confirmation de quelqu'un avec plus de représentant que moi (Grin). Cela gère donc tous les cas de bord de la même manière? (Collection vide, rien qui correspond, d'autres conditions exceptionnelles)


@Joe: Oui. Cela vous donnera les mêmes résultats - la première correspondance, ou par défaut (t) dans le cas d'aucun élément correspondant. C'est effectivement identique, sauf que cela fonctionne sur tout ienumerable



1
votes

ou vous pouvez faire la manière suivante:

var match = myEnumerable.Where(value => value.Aaa == aaa && value.Bbb == bbb)
                        .FirstOrDefault();


7 commentaires

Ceci est interrogé deux fois, ce qui n'est pas nécessaire car vous ne pouvez atteindre le résultat souhaité qu'avec FirstArdefault


@danderson: non true - LINQ utilise une exécution différée, la "question" arrêtera donc d'exécuter dès que le premier élément est trouvé. Ce n'est vraiment pas beaucoup moins efficace que d'utiliser le sincériendefault directement [très légèrement moins efficace, mais seulement à la microscopie. Il n'y a toujours que sur la plupart des itérations à travers la séquence ...


J'ai couru des tests de performance et vérifié cela, mais connaissez-vous également des articles, des blanches blancs ou des liens MSDN qui expliquent comment Linq fonctionne sous la hotte? Je n'ai pas encore trouvé aucun sur MSDN


@danderson - Jon Skeet a une série de blogs de 42 pièces qui aidera: MSMVPS .Com / Blogs / Jon_skeet / Archive / Tags / EDULINQ / Default.aspx


Compte tenu de l'insignifiance des performances mentionnée par @reed, j'ai tendance à préférer la consolidation de toutes les conditions de restriction dans .where plutôt que de les transmettre à des choses comme . Code>. ou .Single aux fins de la clarté. +1 pour ça.


@Shibumi vraiment? J'ai la préférence opposée. J'utilise toujours myenumerable.firstordfault (prédicat) au lieu de myENUREMER


@Jeppestignielsen Je ne peux pas dire que ce que j'ai écrit en 2011 est représentatif de ma philosophie de codage actuelle, et je ne peux même pas parler pourquoi je pensais ainsi, à l'époque. Merci pour le commentaire, cependant!



23
votes

Juste pour référence, voici une table de certains vieux .NET 2 style list code> méthodes d'instance et leurs méthodes d'extension équivalentes dans LINQ:

METHOD IN List<>                              METHOD IN Linq
------------------------------------------------------------------------------------------

list.Contains(item)                           query.Contains(item)

list.Exists(x => x.IsInteresting())           query.Any(x => x.IsInteresting())
list.TrueForAll(x => x.IsInteresting())       query.All(x => x.IsInteresting())

list.Find(x => x.IsInteresting())             query.FirstOrDefault(x => x.IsInteresting())
list.FindLast(x => x.IsInteresting())         query.LastOrDefault(x => x.IsInteresting())

list.FindAll(x => x.IsInteresting())          query.Where(x => x.IsInteresting())

list.ConvertAll(x => x.ProjectToSomething())  query.Select(x => x.ProjectToSomething())


0 commentaires