2013-09-30 11 views
10

Mam ogólną listę, która jest używana wewnątrz metody, która jest wywoływana 4 razy. Ta metoda zapisuje tabelę w pliku PDF z wartościami tej ogólnej listy.Jak odwrócić listę ogólną bez zmiany tej samej listy?

Moim problemem jest to, że muszę odwrócić ten rodzajowy listy wewnątrz metody, ale mam wywołanie metody 4 razy tak lista jest odwracany za każdym razem wywołujemy metodę i nie chcę, że ... co mogę zrobić? Czy istnieje sposób na odwrócenie listy bez mutowania oryginału?

To jest wewnątrz metody:

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

lista były przekazywane w, jest to pole wystąpienie tego typu, jest on generowany z wywołania metody, czy coś innego? – Servy

Odpowiedz

23

Opcja „łatwe” byłoby po prostu iteracyjne listy w odwrotnej kolejności bez faktycznie zmiana samej listy zamiast próbować odwrócić go po raz pierwszy i wiedzieć, aby zrobić nIC inne czasy:

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

za pomocą metody zamiast List Rewers LINQ Reverse możemy iteracyjne go do tyłu bez mutacji listę. Musi tam być AsEnumerable, aby zapobiec używaniu metody.

+0

Tego właśnie szukałem! dziękuję Linq !!! ... i Servy oczywiście :) –

6

Pytasz jak stworzyć odwróconą kopię listy, bez mutacji oryginału.

LINQ może to zrobić:

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

Możesz zrobić jedną z dwóch rzeczy. Albo wyjąć odwrócenie listę od sposobu i odwrócić listę raz przed wywołaniem metody cztery razy, albo zrobić:

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

To wymaga kopię listy przed odwrócenie go, aby nie dotykać oryginalnej listy .

Polecam pierwsze podejście, ponieważ w tej chwili dzwonisz wstecz czterokrotnie zamiast raz.

1

Wszystkie podane opcje do tej pory wewnętrznie kopiują wszystkie elementy do innej listy w odwrotnej kolejności, jednoznacznie jako new_list.Reverse() lub domyślnie t.List.AsEnumerable().Reverse(). Wolę coś, co nie ma tego kosztu, co poniższa metoda rozszerzenia.

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

i może być stosowany jako

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

} 
Powiązane problemy