Find () vs. Where (). FirstOrDefault ()

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.