Ich brauche zu durchlaufen und zu zählen. Was ist am schnellsten oder bevorzugt: ToArray () oder ToList ()? [Duplikat]

StackOverflow https://stackoverflow.com/questions/1826658

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?

War es hilfreich?

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 <>?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top