2013-09-30 19 views
10

Ho una lista generica che viene utilizzata all'interno di un metodo chiamato 4 volte. Questo metodo scrive una tabella in un PDF con i valori di questo elenco generico.Come invertire una lista generica senza cambiare la stessa lista?

Il mio problema è che ho bisogno di invertire questa lista generica all'interno del metodo, ma sto chiamando il metodo 4 volte in modo che la lista venga invertita ogni volta che chiamo il metodo e non voglio che ... cosa posso fare? C'è un modo per invertire la lista senza modificare l'originale?

Questo è all'interno del metodo:

t.List.Reverse(); 
foreach (string t1 in t.List) 
{ 
    //Some code 
} 
+0

è la lista viene passata in, è un campo di quel tipo di istanza, è vero generato da una chiamata a un metodo, o qualcos'altro? – Servy

risposta

23

L'opzione "facile" sarebbe quella di iterare solo l'elenco in ordine inverso senza realmente cambiare la lista stessa invece di cercare di invertire la prima volta e sapere a che fare nulla le altre volte:

foreach (string t1 in t.List.AsEnumerable().Reverse()) 
{ 
    //Some code 
} 

utilizzando il metodo al posto del List Reverse LINQ Reverse, possiamo iterare all'indietro, senza mutare la lista. È necessario che lo AsEnumerable sia presente per impedire l'utilizzo del metodo Reverse.

+0

Questo è quello che stavo cercando! grazie Linq !!! ... e Servy ovviamente :) –

6

stai chiedendo come creare una copia invertita della lista, senza mutare l'originale.

LINQ può farlo:

foreach (var t1 in Enumerable.Reverse(t.List)) 
1

Si può fare una delle due cose. Prendere fuori invertendo l'elenco dal metodo e invertire la lista una volta prima di chiamare il metodo di quattro volte, o fare:

List<My_Type> new_list = new List<Int32>(t.List); 
new_list.Reverse(); 

che prende una copia della lista prima di invertire la tendenza in modo da non toccare l'elenco originale .

Vorrei raccomandare il primo approccio perché in questo momento si chiama Reverse quattro volte anziché solo una volta.

1

Tutte le opzioni specificate fino ad ora copiano tutti gli elementi in un altro elenco in ordine inverso, esplicito come new_list.Reverse() o implicito t.List.AsEnumerable().Reverse(). Preferisco qualcosa che non ha questo costo come il metodo di estensione di seguito.

public class ListExtetions { 
    public static IEnumerable<T> GetReverseEnumerator(this List<T> list) { 
     for (int i = list.Count - 1; i >= 0; i--) 
       return yeild list[i]; 
    } 
} 

e potrebbe essere utilizzato come

foreach (var a in list.GetReverseEnumerator()) { 

} 
Problemi correlati