Ich stoße beim Programmieren häufig darauf, wenn ich einen Loop-Count-Index in einem foreach haben möchte und eine Ganzzahl erstellen, verwenden, inkrementieren usw. Wäre es nicht eine gute Idee, wenn ein Schlüsselwort eingeführt würde Die Anzahl der Schleifen in einem Foreach? Es kann auch in anderen Loops verwendet werden.
Verstößt dies gegen die Verwendung von Schlüsselwörtern, da der Compiler zulässt, dass dieses Schlüsselwort nur in einem Schleifenkonstrukt verwendet wird?
for ()
Schleife verwenden.Antworten:
Wenn Sie eine Schleifenzahl innerhalb einer
foreach
Schleife benötigen, verwenden Sie einfach eine regulärefor
Schleife. Dieforeach
Schleife sollte die spezifische Verwendung vonfor
Schleifen vereinfachen. Es hört sich so an, als hätten Sie eine Situation, in der die Einfachheit desforeach
nicht mehr von Vorteil ist.quelle
IEnumerable.Count
dies teuer sein (oder unmöglich, wenn es sich um eine einmalige Aufzählung handelt). Sie müssen wissen, was die zugrunde liegende Quelle ist, bevor Sie dies sicher tun können.foreach
Over bleiben solltefor (int i = 0…)
. Er hat ein paar Seiten geschrieben, aber ich kann es in zwei Worten zusammenfassen - Compileroptimierung bei Iteration. Ok, das waren keine zwei Wörter.for
Schleife besser lesbaren Code liefert (und theoretische Compileroptimierung oft vorzeitige Optimierung ist).Sie können solche anonymen Typen verwenden
Dies ähnelt der Python-
enumerate
Funktionquelle
Ich füge hier nur die Antwort von Dan Finch hinzu , wie gewünscht.
Gib mir keine Punkte, gib Dan Finch Punkte :-)
Die Lösung besteht darin, die folgende generische Erweiterungsmethode zu schreiben:
Welches wird so verwendet:
quelle
Ich kann mich irren, aber ich dachte immer, dass der Hauptpunkt der foreach-Schleife darin bestand, die Iteration aus den STL-Tagen von C ++ zu vereinfachen, d. H.
Vergleichen Sie dies mit der Verwendung von IEnumerable in foreach durch .NET
Letzteres ist viel einfacher und vermeidet viele der alten Fallstricke. Außerdem scheinen sie fast identischen Regeln zu folgen. Zum Beispiel können Sie den IEnumerable-Inhalt nicht ändern, während Sie sich in der Schleife befinden (was viel sinnvoller ist, wenn Sie es auf STL-Weise betrachten). Die for-Schleife hat jedoch häufig einen anderen logischen Zweck als die Iteration.
quelle
for(IEnumerator e=collection.GetEnumerator;e.MoveNext();) { ... }
Wenn es sich bei der fraglichen Sammlung um eine handelt
IList<T>
, können Sie sie einfachfor
mit der Indizierung verwenden:Wenn nicht, dann könnten Sie verwenden
Select()
, es hat eine Überladung, die Ihnen den Index gibt.Wenn das auch nicht geeignet ist, denke ich, dass es einfach genug ist, diesen Index manuell zu pflegen. Es sind nur zwei sehr kurze Codezeilen. Das Erstellen eines Schlüsselworts speziell dafür wäre ein Overkill.
quelle
foo(++i)
oder davonfoo(i++)
abhängen, welcher Index benötigt wird.Wenn Sie nur wissen, dass es sich bei der Sammlung um eine IEnumerable handelt, Sie jedoch nachverfolgen müssen, wie viele Elemente Sie bisher verarbeitet haben (und damit die Gesamtzahl, wenn Sie fertig sind), können Sie einer grundlegenden for-Schleife ein paar Zeilen hinzufügen:
Sie können einem foreach auch eine inkrementierte Indexvariable hinzufügen:
Wenn Sie dies eleganter gestalten möchten, können Sie eine oder zwei Erweiterungsmethoden definieren, um diese Details zu "verbergen":
quelle
Das Scoping funktioniert auch, wenn Sie den Block frei von Kollisionen mit anderen Namen halten möchten ...
quelle
Dafür benutze ich eine
while
Schleife. Schleifenfor
funktionieren auch, und viele Leute scheinen sie zu bevorzugen, aber ich verwende sie nur gernefor
mit etwas, das eine feste Anzahl von Iterationen hat.IEnumerable
s kann zur Laufzeit generiert werden,while
was meiner Meinung nach sinnvoller ist. Nennen Sie es eine informelle Codierungsrichtlinie, wenn Sie möchten.quelle