181 votes

Trouver () contre Où (). FirstorDefault ()

Je vois souvent des gens utiliser Where.FirstOrDefault () pour effectuer une recherche et récupérer le premier élément. Pourquoi ne pas utiliser simplement 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(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();
        }
    }
}
 

222voto

Anthony Pegram Points 58528

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

L' Where et FirstOrDefault méthodes sont applicables à l'encontre de plusieurs types de séquences, y compris List<T>, T[], Collection<T>, etc. Toute séquence qui implémente IEnumerable<T> pouvez utiliser ces méthodes. Find est disponible uniquement pour l' List<T>. Les méthodes qui sont généralement plus applicable, sont plus réutilisables et ont plus d'impact.

Je suppose que ma prochaine question serait pourquoi ont-ils ajouter le trouver à tous. C'est une bonne astuce. La seule chose que je peux penser, c'est que le FirstOrDefault pourrait retourner une valeur par défaut différente de la valeur autre que null. Sinon, il semble juste comme un inutile plus

Find sur List<T> est antérieure à l'autre des méthodes. List<T> a été ajoutée avec les génériques .NET 2.0, et Find a fait partie de l'API pour la classe. Where et FirstOrDefault ont été ajoutés comme des méthodes d'extension pour IEnumerable<T> avec Linq, ce qui est un plus tard .Version NET. Je ne peux pas dire avec certitude que si Linq existé avec la version 2.0 qui Find n'aurait jamais été ajoutées, mais qui est sans doute le cas pour de nombreuses autres fonctionnalités qui est venu plus tôt .NET les versions qui ont été rendues obsolètes ou redondantes par les versions ultérieures.

58voto

digiben Points 101

Je viens de le découvrir aujourd'hui en effectuant des tests sur une liste d'objets de 80K et j'ai constaté que Find() peut être jusqu'à 1000% plus rapide que d'utiliser un Where avec FirstOrDefault() . Je ne savais pas cela avant de tester une minuterie avant et après tout. Parfois, c'était le même temps, sinon c'était plus rapide.

29voto

penartur Points 5450

Find n'est implémenté qu'en List<T> , alors que Where().FirstOrDefault() fonctionne avec tous les IEnumerable<T> .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X