Find () und Where (). FirstOrDefault ()
Sehe ich oft Menschen mit Where.FirstOrDefault()
zu tun, eine Suche und schnappen Sie sich das erste element. Warum nicht einfach Find()
? Ist es ein Vorteil zu den anderen? Ich konnte nicht sagen, einen Unterschied.
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();
}
}
}
InformationsquelleAutor der Frage KingOfHypocrites | 2012-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wo ist die
Find
Methode aufIEnumerable<T>
? (Rhetorische Frage.)Den
Where
undFirstOrDefault
Methoden sind anwendbar auf mehrere Arten von Sequenzen, einschließlichList<T>
T[]
Collection<T>
usw. Jede Sequenz, dieIEnumerable<T>
können diese Methoden verwenden.Find
ist nur verfügbar für dieList<T>
. Methoden, die in der Regel mehr anwendbar, werden dann mehr wiederverwendbare und haben einen größeren Einfluss.Find
aufList<T>
älter als die anderen Methoden.List<T>
wurde Hinzugefügt, mit Generika .NET 2.0, undFind
war Teil der API für die Klasse.Where
undFirstOrDefault
Hinzugefügt wurden, werden als erweiterungsmethoden fürIEnumerable<T>
mit Linq, die eine später .NET-version. Ich kann nicht mit Sicherheit sagen, dass, wenn Linq existiert mit der Version 2.0, dieFind
würde nie zugegeben haben, aber das ist wohl bei vielen anderen features, die kam früher .NET-Versionen, die wurden überholt oder redundant zu späteren Versionen.InformationsquelleAutor der Antwort Anthony Pegram
Ich habe gerade herausgefunden heute, tun einige tests auf eine Liste von 80K Objekte und festgestellt, dass
Find()
können bis zu 1000% schneller als mit einemWhere
mitFirstOrDefault()
. Ich wusste nicht, dass, bis die Tests ein timer vor und nach jeder alles. Manchmal war es die gleiche Zeit, sonst ging es schneller.InformationsquelleAutor der Antwort digiben
Find
ist nur umgesetzt inList<T>
währendWhere().FirstOrDefault()
funktioniert mit allenIEnumerable<T>
.InformationsquelleAutor der Antwort penartur
Es ist ein sehr wichtiger Unterschied, wenn die Quelle der Daten ist Entity Framework:
Find
finden Entitäten in die 'added' - Zustand, sind noch nicht vorhanden, aberWhere
nicht. Das ist by design.InformationsquelleAutor der Antwort Chalky