È possibile avere un'istruzione foreach
che attraverserà un oggetto Raccolte in ordine inverso?Come si può invertire la traversata attraverso una collezione C#?
Se non è una dichiarazione foreach
, c'è un altro modo?
È possibile avere un'istruzione foreach
che attraverserà un oggetto Raccolte in ordine inverso?Come si può invertire la traversata attraverso una collezione C#?
Se non è una dichiarazione foreach
, c'è un altro modo?
È possibile utilizzare un normale for
ciclo a ritroso, in questo modo:
for (int i = collection.Count - 1; i >= 0 ; i--) {
var current = collection[i];
//Do things
}
è anche possibile utilizzare LINQ:
foreach(var current in collection.Reverse()) {
//Do things
}
Tuttavia, il normale for
ciclo sarà probabilmente un po 'più veloce.
Il ciclo 'for' può essere più veloce, ma LINQ è sicuramente più chiaro. Preferirei quindi la versione LINQ. – jball
+1 per un metodo di estensione che ho dimenticato! –
Non so perché non mi sono reso conto che potresti attraversare una collezione con parentesi ... quindi suppongo che sia solo per (int i = collections.Count; i> = 0; i -) ... Ugh sono un deficiente. Grazie. –
Se si utilizza 3.5, sembra che vi sia un metodo Reverse() in LINQ che non eseguirà l'iterazione in ordine inverso, ma invertirà l'intero elenco, quindi è possibile eseguire il foreach.
Oppure si potrebbe usare una semplice dichiarazione:
for(int i = list.Count -1; i >= 0; --i)
{
x = list[i];
}
Stai chiedendo un errore 'IndexOutOfBounds'. Inizia da 'i = count - 1' – Greg
" Non eseguirà iterazione in ordine inverso, ma invertirà l'intera lista. " Questo non è vero. L'iterazione in ordine inverso è * precisamente * cosa fa il metodo di estensione 'Enumerable.Reverse
@Greg, buona cattura, aggiornato. @Dan Tao, stavo pensando alla lista
Si potrebbe semplicemente chiamare Reverse() sulla raccolta.
foreach(var item in collection.Reverse()) { ... }
Non credo ci sia un Reverse() su Collezioni
@Sam F: È un [metodo di estensione] (http://msdn.microsoft.com/en-us/library/bb383977.aspx) su qualsiasi 'IEnumerable
Suppongo che dovrei aggiungere una nota: in modo abbastanza confuso, Reverse() ha un significato diverso per IList
In alternativa, se la raccolta è un IEnumerable e quindi senza accesso casuale, utilizzare il metodo di System.Linq IEnumerable.Reverse() e applicare forearch come al solito.
using System.Linq;
foreach (var c in collection.Reverse()) {
}
L'inversa è l'unica opzione * valida * per l'iterazione inversa su una raccolta. Troppe raccolte non sono indicizzabili. – 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();
cringing i commenti e le risposte in questa discussione. Reverse() è * non * un sostituto per un ciclo for(), ha O (n) requisiti di memoria. La scatola nera LINQ può essere pericolosa. –
@Hans: sbagliato. 'Reverse' userà' IList' se disponibile. – SLaks
@SLaks: dove? Non lo vedo –