it-swarm.com.de

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

Ich sehe oft Leute, die Where.FirstOrDefault() verwenden, um eine Suche durchzuführen und das erste Element zu greifen. Warum nicht einfach Find() verwenden? Gibt es einen Vorteil gegenüber dem anderen? Ich konnte keinen Unterschied feststellen.

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();
        }
    }
}
117

Wo ist die Find-Methode für IEnumerable<T>? (Rhetorische Frage.)

Die Where- und FirstOrDefault-Methoden sind auf mehrere Arten von Sequenzen anwendbar, einschließlich List<T>, T[], Collection<T> usw. Jede Sequenz, die IEnumerable<T> implementiert, kann diese Methoden verwenden. Find ist nur für den List<T> verfügbar. Methoden, die im Allgemeinen besser anwendbar sind, sind dann wiederverwendbar und haben eine größere Wirkung.

Ich denke, meine nächste Frage wäre, warum sie den Fund überhaupt hinzugefügt haben. Das ist ein guter Tipp. Ich kann mir nur vorstellen, dass FirstOrDefault einen anderen Standardwert als null zurückgibt. Ansonsten scheint es eine sinnlose Ergänzung zu sein

Find on List<T> geht den anderen Methoden voraus. List<T> wurde mit den Generics in .NET 2.0 hinzugefügt, und Find war Teil der API für diese Klasse. Where und FirstOrDefault wurden als Erweiterungsmethoden für IEnumerable<T> mit Linq hinzugefügt, einer neueren .NET-Version. Ich kann nicht mit Bestimmtheit sagen, dass Find niemals hinzugefügt worden wäre, wenn Linq mit der 2.0-Version vorhanden wäre. Dies ist jedoch bei vielen anderen Features der früheren .NET-Versionen der Fall, die in späteren Versionen überflüssig oder überflüssig wurden. 

166
Anthony Pegram

Ich habe gerade herausgefunden, dass ich einige Tests mit einer Liste von 80K-Objekten durchgeführt habe und festgestellt habe, dass Find() bis zu 1000% schneller sein kann als die Verwendung einer Where mit FirstOrDefault(). Ich wusste das nicht, bis ich einen Timer vor und nach jedem getestet habe. Manchmal war es die gleiche Zeit, sonst war es schneller. 

40
digiben

Find ist nur implementiert in List<T>, während Where().FirstOrDefault() mit allen IEnumerable<T> funktioniert.

26
penartur

Es gibt einen sehr wichtigen Unterschied, wenn die Quelle der Daten Entity Framework ist: Find findet Entitäten im Status 'added', die noch nicht persistent sind, Where jedoch nicht. Dies ist beabsichtigt.

24
Chalky

zusätzlich zur Antwort von Anthony Where() besuchen Sie alle Datensätze und geben Sie die Ergebnisse zurück, während Find() nicht alle Datensätze durchlaufen muss, wenn das Prädikat mit dem angegebenen Prädikat übereinstimmt.

sagen Sie also, Sie haben eine Liste der Testklassen mit id- und name-Eigenschaften.

 List<Test> tests = new List<Test>();
 tests.Add(new Test() { Id = 1, Name = "name1" });
 tests.Add(new Test() { Id = 2, Name = "name2" });
 tests.Add(new Test() { Id = 3, Name = "name3" });
 tests.Add(new Test() { Id = 4, Name = "name2" }); 
 var r = tests.Find(p => p.Name == "name2");
 Console.WriteLine(r.Id);

Gibt die Ausgabe von 2 und nur 2 Visits aus. Findet das Ergebnis, aber wenn Sie Where().FirstOrDefault() verwenden, besuchen wir alle Datensätze und erhalten dann Ergebnisse. 

Wenn Sie also wissen, dass Sie nur das erste Ergebnis aus Datensätzen in der Sammlung wünschen, ist Find() geeigneter als Where().FirtorDefault();.

0
M Muneeb Ijaz