Find() vs Où().FirstOrDefault()

je vois souvent des gens utiliser Where.FirstOrDefault() pour faire une recherche et saisir le premier élément. Pourquoi ne pas utiliser Find() ? Est-il un avantage à l'autre? Je ne pouvais pas dire une différence.

namespace LinqFindVsWhere
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();
            list.AddRange(new string[]
            {
                "item1",
                "item2",
                "item3",
                "item4"
            });

            string item2 = list.Find(x => x == "item2");
            Console.WriteLine(item2 == null ? "not found" : "found");
            string item3 = list.Where(x => x == "item3").FirstOrDefault();
            Console.WriteLine(item3 == null ? "not found" : "found");
            Console.ReadKey();
        }
    }
}
111
demandé sur Wai Ha Lee 2012-02-18 00:35:28

4 réponses

Où est la méthode Find sur IEnumerable<T> ? (Question rhétorique.)

les méthodes Where et FirstOrDefault sont applicables contre plusieurs types de séquences, y compris List<T> , T[] , Collection<T> , etc. Toute séquence qui implémente IEnumerable<T> peut utiliser ces méthodes. Find n'est disponible que pour le List<T> . Les méthodes qui sont généralement plus applicables, sont alors plus réutilisable et avoir un plus grand impact.

je suppose que ma prochaine question serait pourquoi ont-ils ajouter le trouver. C'est une bonne astuce. La seule chose à laquelle je pense est que FirstOrDefault pourrait retourner une valeur par défaut différente de null. Sinon, il semble tout simplement comme un ajout inutile

Find on List<T> est antérieur aux autres méthodes. List<T> a été ajouté avec les génériques dans .NET 2.0, et Find a été une partie de L'API pour cette classe. Where et FirstOrDefault ont été ajoutés en tant que méthodes d'extension pour IEnumerable<T> avec Linq, qui est une version plus récente 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 qui sont venues plus tôt.les versions de net qui ont été rendues obsolètes ou redondantes par des versions ultérieures.

152
répondu Anthony Pegram 2012-02-17 20:52:52

je viens de le découvrir aujourd'hui, en faisant quelques tests sur une liste D'objets de 80K et constaté que Find() peut être jusqu'à 1000% plus rapide que l'utilisation d'un Where avec FirstOrDefault() . Je ne le savais pas jusqu'à ce que je teste un minuteur avant et après tout. Parfois, c'était la même heure, sinon c'était plus rapide.

38
répondu digiben 2012-11-02 01:22:29

Find est seulement mise en œuvre dans List<T> , tandis que Where().FirstOrDefault() fonctionne avec tous les IEnumerable<T> .

25
répondu penartur 2012-02-17 20:39:24

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 persistées, mais Where ne le sera pas. C'est par la conception.

20
répondu Chalky 2017-04-18 00:20:02