Ist es möglich, eine foreach
Aussage zu haben, die durch ein Kollektion Objekt in umgekehrter Reihenfolge durchlaufen werden?Wie können Sie eine C# -Sammlung zurückverfolgen?
Wenn kein foreach
Aussage, ist es eine andere Möglichkeit?
Ist es möglich, eine foreach
Aussage zu haben, die durch ein Kollektion Objekt in umgekehrter Reihenfolge durchlaufen werden?Wie können Sie eine C# -Sammlung zurückverfolgen?
Wenn kein foreach
Aussage, ist es eine andere Möglichkeit?
Sie können eine normale for
Schleife rückwärts verwenden, wie folgt aus:
for (int i = collection.Count - 1; i >= 0 ; i--) {
var current = collection[i];
//Do things
}
Sie auch LINQ verwenden können:
foreach(var current in collection.Reverse()) {
//Do things
}
jedoch die normale for
Schleife wird wahrscheinlich ein wenig schneller sein.
Die For-Schleife kann schneller sein, aber die LINQ ist sicherlich klarer. Ich würde daher die LINQ-Version bevorzugen. – jball
+1 für eine Erweiterungsmethode, die ich vergessen habe! –
Ich weiß nicht, warum ich nicht erkennen, Sie mit Klammern durch eine Sammlung ... durchqueren können, so dass ich denke, es ist nur for (int i = collections.Count; i> = 0; i -) ... Ugh, ich bin ein Idiot. Vielen Dank. –
Wenn Sie mit 3,5 arbeiten, sieht es so aus, als gäbe es in LINQ eine Reverse() -Methode Das wird nicht in umgekehrter Reihenfolge durchlaufen, aber würde die gesamte Liste umkehren, dann könnten Sie Ihre Foreach tun.
Oder Sie könnten eine einfache for-Anweisung verwenden:
for(int i = list.Count -1; i >= 0; --i)
{
x = list[i];
}
Sie fragen nach einem 'IndexOutOfBounds' Fehler. Start bei 'i = count - 1' – Greg
" Das wird nicht in umgekehrter Reihenfolge durchlaufen, sondern würde die gesamte Liste umkehren. " Das ist falsch. Das Iterieren in umgekehrter Reihenfolge ist * genau * was die Erweiterungsmethode "Enumerable.Reverse
@Greg, guter Fang, aktualisiert. @Dan Tao, ich dachte an die Liste
Sie haben soeben Reverse() auf die Sammlung nennen könnte.
foreach(var item in collection.Reverse()) { ... }
Ich glaube nicht, dass es eine Reverse() auf Sammlungen
@Sam F: Es ist eine [Erweiterungsmethode] (http://msdn.microsoft.com/en-us/library/bb383977.aspx) auf jedem 'IEnumerable
Ich nehme an, ich sollte eine Notiz hinzufügen - verwirrend genug, Reverse() hat eine andere Bedeutung für IList
Alternativ, wenn die Sammlung ein IEnumerable ist und deshalb ohne Random Access verwenden System.Linq der IEnumerable.Reverse() -Methode und wenden forearch wie gewohnt.
using System.Linq;
foreach (var c in collection.Reverse()) {
}
Reverse ist die einzige * praktikable * Option für die umgekehrte Iteration über eine Sammlung. Zu viele Sammlungen sind nicht indexierbar. – Randolpho
List<string> items = new List<string>
{
"item 1",
"item 2",
"item 3",
"item 4",
};
lines.AsEnumerable().Reverse()
.Do(a => Console.WriteLine(a), ex => Console.WriteLine(ex.Message),() => Console.WriteLine("Completed"))
.Run();
auf die Kommentare und Antworten in diesem Thread kriechend. Reverse() ist * nicht * ein Ersatz für eine for() - Schleife, es hat O (n) Speicheranforderungen. Die LINQ-Blackbox kann gefährlich sein. –
@Hans: Falsch. 'Reverse' verwendet' IList' falls verfügbar. – SLaks
@SLaks: wo? Ich sehe es nicht. –