Je vois souvent des personnes utilisant Where.FirstOrDefault()
pour effectuer une recherche et saisir le premier élément. Pourquoi ne pas utiliser Find()
? Y a-t-il un avantage pour l’autre? Je ne pouvais pas faire la différence
namespace LinqFindVsWhere { class Program { static void Main(ssortingng[] args) { List list = new List(); list.AddRange(new ssortingng[] { "item1", "item2", "item3", "item4" }); ssortingng item2 = list.Find(x => x == "item2"); Console.WriteLine(item2 == null ? "not found" : "found"); ssortingng item3 = list.Where(x => x == "item3").FirstOrDefault(); Console.WriteLine(item3 == null ? "not found" : "found"); Console.ReadKey(); } } }
Où est la méthode Find
sur IEnumerable
? (Question rhétorique.)
Les méthodes Where
et FirstOrDefault
sont applicables à plusieurs types de séquences, y compris List
, T[]
, Collection
, etc. Toutes les séquences qui implémentent IEnumerable
peuvent utiliser ces méthodes. Find
est disponible uniquement pour la List
. Les méthodes généralement plus applicables sont alors plus réutilisables et ont un impact plus important.
Je suppose que ma prochaine question serait pourquoi ont-ils ajouté la découverte du tout. C’est un bon conseil. La seule chose à laquelle je peux penser est que FirstOrDefault pourrait renvoyer une valeur par défaut différente de null. Sinon, cela semble juste un ajout inutile
Find
sur la List
est antérieure aux autres méthodes. List
été ajouté avec des génériques dans .NET 2.0, et Find
faisait partie de l’API pour cette classe. Where
et FirstOrDefault
ont été ajoutés en tant que méthodes d’extension pour IEnumerable
avec Linq, qui est une version ultérieure de .NET. Je ne peux pas dire avec certitude que si Linq existait avec la version 2.0, Find
n’aurait jamais été ajouté, mais c’est sans doute le cas pour de nombreuses autres fonctionnalités des versions antérieures de .NET rendues obsolètes ou redondantes par les versions ultérieures.
Je viens de découvrir aujourd’hui, faisant des tests sur une liste d’objects 80K et trouvé que Find()
peut être jusqu’à 1000% plus rapide que d’utiliser un Where
avec FirstOrDefault()
. Je ne le savais pas avant de tester un minuteur avant et après chacun. Parfois c’était le même temps, sinon c’était plus rapide.
Find
est uniquement implémenté dans List
, tandis que Where().FirstOrDefault()
fonctionne avec tous les IEnumerable
.
Il y a une différence très importante si la source des données est Entity Framework: Find
trouvera des entités dans l’état “ajouté” qui ne sont pas encore persistantes, mais Where
ne le sera pas. C’est par conception.