Ich brauche zu durchlaufen und zu zählen. Was ist am schnellsten oder bevorzugt: ToArray () oder ToList ()? [Duplikat]
-
22-07-2019 - |
Frage
Mögliche Duplizieren:
Ist es besser ToList () aufrufen oder ToArray () in LINQ-Abfragen?
Ich habe Code wie folgt:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
foreach(var item in t)
{
..
}
var j = t.Count; // also I need this
}
Welche Methode bevorzugt?
Ich konnte ohne gehen, aber ich brauche die Größe kennen und ich will nicht Enumerable.Count<T>()
nennen - es scheint, Array<T>.Size
oder List<T>.Count
weitere Aktionen dann do zu tun. Habe ich Recht?
Lösung
Eigentlich in der aktuellen MS Implementierung von Count (IEnumerable) gibt es eine Abkürzung suchen, wenn die IEnumerable eine ICollection ist und Anrufe Verlass dich drauf. So soll die Leistung vergleichbar sein für Elemente zu zählen.
ToList und ToArray ist ein bisschen gleich. Wenn die IEnumerable ist ein ICollection, dann ist die CopyTo-Methode stattdessen aufgerufen wird, die ein bisschen schneller ist.
So wählen Sie, was macht Ihren Code der am lesbar und Maßstab für Ihren Anwendungsfall eine definitive Antwort zu haben.
Update: Ich habe eine naive Benchmark.
Beginnend mit einem Array: var items = Enumerable.Range(1,1000).ToArray();
- Aufruf ToList (): 25ms / 10000
- Aufruf ToArray (): 23 ms / 10000
Beginnend mit einem IEnumerable: var items = Enumerable.Range(1,1000);
- Aufruf ToList (): 168ms / 10000
- Aufruf ToArray (): 171 ms / 10000
Also im Grunde erhalten Sie eine vergleichbare Leistung.
Andere Tipps
Wenn Sie wirklich besorgt über Leistung, sollten Sie Schleife über die IEnumerable
und zählen, wie Sie gehen. Dies vermeidet eine neue Kollektion zusammen zu erstellen, und der Schnittpunkt nur einmal wiederholt werden:
void Foobar(string[] arr, Dictionary<string, string[]>)
{
var t = arr.Intersect(dic.Keys);
int count = 0;
foreach(var item in t)
{
count++;
..
}
var j = count;
}
Aber wie jemand anders gesagt: Das riecht nach Mikro-Optimierung. Wenn die Leistung wirklich in dieser Situation wichtig ist, zumindest tut Leistungsprofil, welche Methode, um herauszufinden, ist wirklich die schnellste für Sie.
Der Unterschied ist wahrscheinlich so klein, dass es sich lohnt, nur mit der Methode, die Ihren Bedürfnissen besser entspricht. Riecht von Mikro-Optimierung.
Und in diesem Fall, da alles, was Sie tun, um die Menge ist Aufzählen und Zählen der Satz (die Sie beide mit einem IEnumerable tun können), warum nicht einfach lassen Sie es wie ein IEnumerable <>?