Frage

Das ist in der Regel am schnellsten, wenn Lesen/Vergleich der info-Zeile aus einem DataTable?

'assume dt as datatable'

'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
   ....
next

'method 2'
dim row as datarow
for each row in dt.rows
    ....
next

Und wenn es ist ein Unterschied, in welchen Fällen lohnt es sich zu verwenden Sie einen über den anderen?

Vielen Dank im Voraus für jede Anleitung!

War es hilfreich?

Lösung

Der Compiler erweitert For Each auf eine kurze while-Schleife.

for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
    row = e.Current

So haben Sie eine kleine Menge an Overhead bezahlen. Aber für Klarheiten willen, würde ich mit For Each bleiben nach wie vor, wenn Sie nur auf eine Zeile zu arbeiten, und Sie werden nicht den Datensatz zu ändern.

Andere Tipps

kein Unterschied in der Realität. Obwohl Sie technisch einen kleinen Preis in dem foreach-Verfahren bezahlen, für durch die IEnumerable-Schnittstelle gehen.

Die zweite wäre eine leichte Strafe haben. Da jedoch für die Umstände, persoanlly würde ich immer verwendet Methode 2 aus Gründen der Klarheit des Codes. Allerdings würde ich verwenden Methode 1, wenn ich überhaupt etwas tun müssen, wie eine nächste / vorherige Zeile zugreift, während die aktuelle Zeile zu analysieren.

Nun, es ist ein Unterschied, da GetEnumerator und Movenext, die in foreach-Schleife aufgerufen virtuell ist (calling erfordert über einen Zeiger zu gehen) und somit nicht inlined werden kann. Dieser Overhead in der Realität ist klein, es sei denn, Sie ein Los von Schleifen tun.

In einigen Fällen wenn der Compiler foreach mit einer for-Schleife ersetzen wird (ich glaube, wenn sie über Arrays iterieren).

Ich persönlich foreach in meinem ASP.NET MVC-Code für Klarheit bevorzugen, wie viele hier gesagt haben, aber oft verwende die zu for-Schleife. Joe Duffy gab vor kurzem einen interessanten Artikel über die Kosten der Aufzählen http://joeduffyblog.com/2008/09 / 21 / das-Cost-of-Aufzählen-in-net /

@ gdean232 stimmt - fast keinen Unterschied überhaupt. Wenn die Leistung ist ein Thema, eine ein SqlDataReader anstelle fällt schneller.

Die foreach-Implementierung ist tatsächlich etwas schneller als der standard für die Umsetzung, da jeder index-array zugreifen muss Grenzen überprüft.Jedoch, seit die Redewendung:

for(int i =0; i < myArray.Count; ++i)
{
    // do something with myArray[i];
}

üblich ist, sucht der compiler es als ein besonderer Fall und optimiert es, damit es schneller wird.Jedoch, jede kleine Abweichung von diesem format (wie int len = MyArray.Count;for(int i =0;ich< len;++ich)) nicht erkannt werden, und es werden die langsameren code.

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