Ich sehe oft Leute Where.FirstOrDefault()
, die eine Suche durchführen und das erste Element greifen. Warum nicht einfach benutzen Find()
? Gibt es einen Vorteil für den 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();
}
}
}
c#
linq
linq-to-objects
KingOfHypocrites
quelle
quelle
list.FirstOrDefault(x => x == "item3");
ist prägnanter als die Verwendung von.Where
und.FirstOrDefault
.Find
älter als LINQ. (Es war in .NET 2.0 verfügbar und Sie konnten keine Lambdas verwenden. Sie mussten normale oder anonyme Methoden verwenden.)Antworten:
Wo ist die
Find
MethodeIEnumerable<T>
? (Rhetorische Frage.)Die
Where
undFirstOrDefault
Verfahren ist anwendbar gegen mehrere Arten von Sequenzen, einschließlichList<T>
,T[]
,Collection<T>
etc. beliebiger Reihenfolge , dass ArbeitsgeräteIEnumerable<T>
diese Methoden verwenden kann.Find
ist nur für die verfügbarList<T>
. Methoden, die im Allgemeinen besser anwendbar sind, sind dann wiederverwendbarer und haben eine größere Wirkung.Find
on istList<T>
älter als die anderen Methoden.List<T>
wurde mit Generika in .NET 2.0 hinzugefügt undFind
war Teil der API für diese Klasse.Where
undFirstOrDefault
wurden als Erweiterungsmethoden fürIEnumerable<T>
Linq hinzugefügt , eine spätere .NET-Version. Ich kann nicht mit Sicherheit sagen, dass wenn Linq mit der Version 2.0 existiertFind
hätte , diese niemals hinzugefügt worden wäre, aber dies ist wohl der Fall für viele andere Funktionen, die in früheren .NET-Versionen enthalten waren, die durch spätere Versionen veraltet oder überflüssig wurden.quelle
Where(condition).FirstOrDefault()
optimiert mindestens so gut und manchmal besser alsFirstOrDefault(condition)
allein. Wir verwenden immerWhere()
, um die verbesserte Leistung zu erhalten, wenn verfügbar.Ich habe es heute gerade herausgefunden, als ich einige Tests mit einer Liste von 80K-Objekten durchgeführt habe, und festgestellt, dass
Find()
dies bis zu 1000% schneller sein kann als die Verwendung einesWhere
withFirstOrDefault()
. Das wusste ich erst, als ich vor und nach jedem einen Timer getestet hatte. Manchmal war es die gleiche Zeit, sonst war es schneller.quelle
.ToList()
oder materialisiert.ToArray()
, um die Abfrage tatsächlich durchzuführen.Find
dass die Primärschlüssel (daher Indizes) verwendet werden, währendWhere
es sich um eine einfache SQL-Abfrage handeltEs gibt einen sehr wichtigen Unterschied, wenn die Datenquelle Entity Framework ist:
Find
Entitäten werden im Status 'hinzugefügt' gefunden, die noch nicht beibehalten wurden, aberWhere
nicht. Dies ist beabsichtigt.quelle
Find
nur wird umgesetzt inList<T>
, währendWhere().FirstOrDefault()
Arbeiten mit allenIEnumerable<T>
.quelle
Zusätzlich zu Anthony beantworte den
Where()
Besuch durch alle Datensätze undFind()
gib dann die Ergebnisse zurück, während nicht alle Datensätze durchlaufen werden müssen, wenn das Prädikat mit dem angegebenen Prädikat übereinstimmt.Angenommen, Sie haben eine Liste mit Testklassen
id
undname
Eigenschaften.Gibt eine Ausgabe von
2
und nur 2 Besuche. Die Suche wird benötigt, um das Ergebnis zu liefern. Wenn Sie jedoch verwendenWhere().FirstOrDefault()
, besuchen wir alle Datensätze und erhalten dann Ergebnisse.Wenn Sie also wissen, dass Sie nur das erste Ergebnis von Datensätzen in der Sammlung
Find()
wünschen, ist dies besser geeignetWhere().FirtorDefault();
quelle
FirstOrDefault
wird die Kette "sprudeln" lassen und aufhören, alles aufzuzählen. Ich verwende den Begriff "Bubble-up", weil es keinen besseren Ausdruck gibt, da tatsächlich jeder Selektor / jedes Prädikat an das nächste weitergegeben wird, sodass die letzte Methode in der Kette tatsächlich zuerst arbeitet.Wow, ich schaue mir heute das EF-Tutorial von MicrosofToolbox auf Youtube an. Er hat über die Verwendung von Find () und FirstOrDefault (Bedingung) in der Abfrage gesprochen, und Find () sucht nach den Daten, die Sie für dieses Objekt ausgeführt haben (Hinzufügen oder Bearbeiten oder Löschen - aber noch nicht in der Datenbank gespeichert), während FirstOrDefault dies nur tut Suchen Sie nach dem, was bereits gespeichert wurde
quelle
Find()
ist das IEnumerable-Äquivalent von aFirstOrDefault()
. Sie sollten nicht beide .Where () mit verketten,.FirstOrDefault()
da das.Where()
das gesamte Array durchläuft und dann diese Liste durchläuft, um das erste Element zu finden. Sie sparen unglaublich viel Zeit, indem Sie Ihr Suchprädikat in dieFirstOrDefault()
Methode einfügen.Ich empfehle Ihnen außerdem, die mit diesem Thread verknüpfte Frage zu lesen, um mehr über die besseren Leistungen bei der Verwendung der
.Find()
in bestimmten Szenarien durchgeführten Leistung von Find () vs. FirstOrDefault () zu erfahren.quelle