Gedanken auf foreach mit Enumerable.Range gegen traditionelle für Schleife
In C# 3.0, ich mag diesen Stil:
//Write the numbers 1 thru 7
foreach (int index in Enumerable.Range( 1, 7 ))
{
Console.WriteLine(index);
}
über die traditionellen for
Schleife:
//Write the numbers 1 thru 7
for (int index = 1; index <= 7; index++)
{
Console.WriteLine( index );
}
Vorausgesetzt, 'n' ist klein, so dass die Leistung ist nicht ein Problem, hat jemand Objekt an den neuen Stil gegenüber den traditionellen Stil?
InformationsquelleAutor der Frage Marcel Lamothe | 2009-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich finde, letzteres ist "minimum-maximum" - format viel klarer als
Range
's "Mindest-Anzahl" - Stil für diesen Zweck. Auch ich glaube nicht, dass es wirklich eine gute Praxis, um eine änderung vorzunehmen, wie dies von der norm, nicht schneller, nicht kürzer, nicht mehr vertraut, und offensichtlich nicht klarer.Sagte, ich bin nicht gegen die Idee im Allgemeinen. Wenn Sie kam zu mir mit der syntax, die so ähnlich aussah
foreach (int x from 1 to 8)
dann würde ich wahrscheinlich Zustimmen, dass das eine Verbesserung wäre über einefor
Schleife. AllerdingsEnumerable.Range
ist ziemlich klobig.InformationsquelleAutor der Antwort mquander
Dies ist nur zum Spaß. (Ich würde nur die standard "
for (int i = 1; i <= 10; i++)
" loop-format selbst.)Könnten Sie auch hinzufügen, eine
Step
Erweiterung Methode zu:InformationsquelleAutor der Antwort LukeH
In C# 6.0 mit dem Einsatz von
können Sie vereinfachen es zu
InformationsquelleAutor der Antwort Tsayper
Können Sie tatsächlich tun dies in C# (durch die Bereitstellung von
To
undDo
als Erweiterung Methoden aufint
undIEnumerable<T>
jeweils):SmallTalk für immer!!!
InformationsquelleAutor der Antwort THX-1138
Wie es scheint, ziemlich langatmige Herangehensweise an ein problem, das bereits gelöst. Es gibt eine ganze state machine hinter den
Enumerable.Range
das ist nicht wirklich nötig.Dem traditionellen format ist grundlegend für Entwicklung und allen vertraut. Sehe ich nicht wirklich einen Vorteil für Ihren neuen Stil.
InformationsquelleAutor der Antwort spender
Ich denke, dass die foreach - + Aufzählbar.Reichweite ist weniger Fehler anfällig (Sie haben weniger Kontrolle und weniger Möglichkeiten, es zu tun falsch, wie die Verringerung der index innerhalb der Körper, so würde die Schleife nie enden, etc.)
Die Lesbarkeit problem ist über die Range-Funktion Semantik, das kann sich ändern, von einer Sprache zu einer anderen (von e zu.g wenn nur einer der parameter, wird es beginnen von 0 oder 1, oder ist das Ende ein-oder ausgeschlossen oder ist der zweite parameter eine Zählung statt einem end-Wert).
Über die Leistung, denke ich, sollte der compiler clever genug sein, zu optimieren beide Schlaufen, so dass Sie eine Ausführung mit einer ähnlichen Geschwindigkeit auch bei großen Reichweiten (ich nehme an, dass ein Bereich nicht eine Sammlung erstellen, aber natürlich ist es eine iterator).
InformationsquelleAutor der Antwort fortran
Irgendwie gefällt mir die Idee. Es ist sehr viel wie Python. Hier ist meine version in ein paar Zeilen:
Funktioniert es wie Python ' s:
0.To(4)
→[ 0, 1, 2, 3 ]
4.To(0)
→[ 4, 3, 2, 1 ]
4.To(4)
→[ ]
7.To(-3, -3)
→[ 7, 4, 1, -2 ]
InformationsquelleAutor der Antwort Kache
Ich würde gerne die syntax von anderen Sprachen wie Python, Haskell, etc.
Zum Glück hatte bekamen wir F# jetzt 🙂
Als für C#, ich werde stick mit der
Enumerable.Range
Methode.InformationsquelleAutor der Antwort Thomas Danecker
@Lukas:
Ich reimplementiert Ihre
To()
Erweiterung Methode und verwendet dieEnumerable.Range()
Methode, es zu tun.Auf diese Weise kommt es ein wenig kürzer und wird so viel Infrastruktur, die uns gegeben .NET wie möglich:
InformationsquelleAutor der Antwort Thorsten Lorenz
Ich bin sicher, jeder hat seine persönlichen Vorlieben (viele würden es vorziehen, die später, nur weil es vertraut ist, über fast alle Programmiersprachen), aber ich bin wie du und ab wie die foreach-mehr und mehr, besonders jetzt, können Sie einen Bereich definieren.
InformationsquelleAutor der Antwort TheTXI
Ich denke Range ist nützlich für die Arbeit mit einem bestimmten Bereich inline:
Können Sie jeden über. Erfordert das konvertieren zu-Liste, sondern hält die Dinge kompakt, wenn das, was Sie wollen.
Aber andere als die für so etwas verwende ich traditionelle for-Schleife.
InformationsquelleAutor der Antwort mcNux
Ich mir vorstellen, könnte es Szenarien, in denen
Enumerable.Range(index, count)
wird klarer, wenn der Umgang mit Ausdrücken für die Parameter, vor allem, wenn einige der Werte in diesem Ausdruck geändert werden, innerhalb der Schleife. Im Fall vonfor
den Ausdruck auszuwerten, basierend auf dem Zustand nach der aktuellen iteration, in der Erwägung, dassEnumerable.Range()
ausgewertet up-front.Andere als die, würde ich Zustimmen, dass kleben mit
for
normalerweise besser (vertrauter/lesbar für mehr Menschen lesbar... ist ein sehr wichtiger Wert im code, der eingehalten werden muss).InformationsquelleAutor der Antwort jerryjvl
Meiner Meinung nach die
Enumerable.Range()
Weg ist eher deklarativ. Neue und fremde Menschen? Sicherlich. Aber ich denke, das deklarative Ansatz ergibt die gleichen Vorteile wie die meisten anderen LINQ-bezogene Funktionen der Sprache.InformationsquelleAutor der Antwort MEMark
Streng genommen, Sie missbrauchen enumeration.
Enumerator bietet die Möglichkeit, den Zugriff auf alle Objekte in einem container one-by-one, aber es übernimmt keine Garantie für die Reihenfolge.
Es ist OK zu verwenden Aufzählung zu finden, die größte Zahl in einem array. Wenn Sie es finden, sagen wir, ersten nicht-null-element, Sie verlassen sich auf die Implementierung detail, dass Sie sollten nicht wissen über. In deinem Beispiel, die Reihenfolge scheint wichtig zu sein für Sie.
Bearbeiten: ich bin falsch. Als Luke hingewiesen (siehe Kommentare) ist es sicher, verlassen sich auf die Reihenfolge bei der Aufzählung ein array in C#. Dies unterscheidet sich von, zum Beispiel, mit "in" für das auflisten der ein array in Javascript .
InformationsquelleAutor der Antwort buti-oxa
Ich bin damit einverstanden, dass in vielen (oder sogar den meisten Fällen)
foreach
ist sehr viel besser lesbar als ein standard -for
- Schleife, wenn einfach der Iteration über eine collection. Jedoch, Ihre WahlEnumerable.Range(index, count)
ist das nicht ein starkes Beispiel für den Wert vonforeach
vorbei.Für eine einfache Palette ab
1, Enumerable.Range(index, count)
sieht gut lesbar. Allerdings, wenn der Bereich beginnt mit einem anderen index, es wird weniger lesbar, da müssen Sie richtig ausführenindex + count - 1
zu bestimmen, was das Letzte element wird. Zum Beispiel...In diesem Fall, ich bevorzuge das zweite Beispiel.
InformationsquelleAutor der Antwort Dustin Campbell
Ich mag die
foreach
+Enumerable.Range
Ansatz und verwenden Sie es manchmal.Ich-Objekt, um die
var
Missbrauch in Ihren Vorschlag. Ich Schätzevar
aber, verdammt, schreiben Sie einfachint
in diesem Fall! 😉InformationsquelleAutor der Antwort xyz