2013-09-30 3 views
10

Ich habe eine generische Liste, die innerhalb einer Methode verwendet wird, die 4 Mal aufgerufen wird. Diese Methode schreibt eine Tabelle in eine PDF mit den Werten dieser generischen Liste.Wie man eine generische Liste umkehrt, ohne die gleiche Liste zu ändern?

Mein Problem ist, dass ich diese generische Liste innerhalb der Methode umkehren muss, aber ich rufe die Methode 4 mal so die Liste wird jedes Mal umgekehrt, wenn ich die Methode aufrufen und ich will das nicht ... Was kann ich tun? Gibt es eine Möglichkeit, die Liste umzukehren, ohne das Original zu verändern? Diese

ist in der Methode:

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

die Liste übergeben werden wird, ist es ein Instanzfeld dieses Typs wird von einem Aufruf einer Methode erzeugt wird, oder etwas anderes? – Servy

Antwort

23

Die „easy“ Option wäre, nur die Liste in umgekehrter Reihenfolge durchlaufen, ohne tatsächlich die Änderung die Liste selbst anstatt zu versuchen, es das erste Mal zu umkehren und wissen zu tun nichts, was die anderen Zeiten:

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

die LINQ Reverse Methode anstelle des List umge verwenden, können wir es rückwärts durchlaufen, ohne die Liste mutiert. Die AsEnumerable muss vorhanden sein, um zu verhindern, dass die Methode ListReverse verwendet wird.

+0

Das ist, was ich gesucht habe! Danke Linq !!! ... und Servy natürlich :) –

6

Sie fragt, wie eine umgekehrte Kopie der Liste erstellen, ohne das Original zu mutieren.

LINQ kann das tun:

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

Sie können eines von zwei Dingen tun. Entweder nehmen Sie die Liste aus dem Verfahren Umkehren und die Liste umkehren einmal vor dem Verfahren viermal anrufen, oder tun:

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

, dass eine Kopie der Liste nimmt, bevor es umgekehrt so berühren Sie nicht die ursprüngliche Liste .

Ich würde den ersten Ansatz empfehlen, weil Sie Reverse jetzt vier Mal statt nur einmal aufrufen.

1

Alle angegebenen Optionen kopieren bis jetzt alle Elemente intern in eine andere Liste in umgekehrter Reihenfolge, explizit wie new_list.Reverse() oder implizit t.List.AsEnumerable().Reverse(). Ich bevorzuge etwas, das diese Kosten nicht als Verlängerungsmethode unten hat.

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]; 
    } 
} 

und könnte als

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

} 
Verwandte Themen