warum foreach ist schneller als die for-Schleife beim Lesen der richtextbox Zeilen
Gibt es zwei Möglichkeiten, zum Lesen von Daten aus RichTextBox-Steuerelement Zeile für Zeile
1 ) verwenden Sie eine for-Schleife, um durch die Zeilen einer richtextBox
String s=String.Empty;
for(int i=0;i<richtextbox.lines.length;i++)
{
s=richTextBox.Lines[i]
}
2 ) mit einer foreach-Schleife aufzählen richTextBox-Steuerelement.Linien collection
String s=String.Empty;
foreach(string str in txtText.Lines)
{
s=str;
}
Ist es ein riesiger Unterschied in der Leistung wenn wir die foreach-Schleife zum aufzählen array Kollektion für richtextbox.
Habe ich versucht mit 15000 Zeilen.for-Schleife brauchte 8 Minuten, um nur Schleife nach unten zu 15000 Zeilen.während foreach nahm Bruchteil einer Sekunde, um Sie aufzulisten.
Warum ist dieses Verhalten gibt es?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Mehrdad darauf hingewiesen, Zugriff auf die
Lines
- Eigenschaft nimmt eine lange Zeit. Sie müssen hier vorsichtig sein - Sie sind auf es zweimal in jeder iteration im moment:Auch wenn Sie den Zugang in den Körper der Schleife wie diese:
du bist noch Zugriff auf
Lines
bei jeder iteration um zu sehen, wenn Sie fertig sind!Wenn Sie nicht wollen, um
foreach
können Sie nur abrufenLines
einmal:Persönlich bevorzuge ich die
foreach
es sei denn, Sie wirklich brauchen, der index aber 🙂Ich denke, die
Lines
Eigenschaft wird neu berechnet, jedes mal, wenn Sie darauf zugreifen möchten. Folglich, dieforeach
- Methode führt die Berechnung nur einmal, während jede Zeit Ihre ReferenzLines[i]
es ist, neu zu bewerten, die ganze Sache. Versuchen caching das ErgebnisLines
Eigentum und Kontrolle wieder:Durch die Art und Weise, Ihre Frage macht eine implizite Annahme, dass
foreach
ist immer langsamer alsfor
. Dies ist nicht immer wahr.Lines
Eigenschaft. Es fordertGetEnumerator()
auf es und verwendet nur die resultierende enumerator. DieLines
Eigenschaft wird nie wieder aufgerufen.foreach
ist in der Regel bevorzugt, es sei denn, Sie benötigen Zugriff auf die Dinge, die durch den index. Wenn das, was Sie versuchen zu tun, ist "für jedes Element in der Kollektion, machen dieses Ding" in Ihrem Kopf, Sie sollten gehen in der Regel mitforeach
.Wahrscheinlich, weil das finden der nächsten Zeile in der textbox braucht Zeit. Wenn Sie random-Zugriff durch Indizierung im ersten Fall muss er feststellen, dass die Linie von Grund auf. Wenn die iteration erfolgt intern durch
foreach
, es kann behalten Zustand und finden schnell die nächste Zeile.Dies sollte der erste Fall in O(n^2) Zeit, während der zweite läuft in O(n).
Könnte es sein, dass jede Zeile, die kopiert wird, um eine neue string-variable (str) nach jedem loop? Ich bin guissing hier, aber Sie könnte wahrscheinlich überprüfen die Theorie mit diesem code
.NET Reflector ist sehr nützlich, um zu bestimmen, warum Sie sehen, die Leistung, die Sie nicht erwarten.
Versuchen Sie es Blick auf die
Lines
get
accessor, um zu sehen, was es tatsächlich jedes mal, wenn Sie darauf zugreifen.