2013-09-30 1 views
10

У меня есть общий список, который используется внутри метода, который называется 4 раза. Этот метод записывает таблицу в PDF со значениями этого общего списка.Как изменить общий список без изменения одного и того же списка?

Моя проблема в том, что мне нужно отменить этот общий список внутри метода, но я вызываю метод 4 раза, чтобы список менялся каждый раз, когда я вызываю метод, и я не хочу этого ... что я могу сделать? Есть ли способ изменить список без изменения оригинала?

Это внутри метода:

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

ли передается список в, это экземпляр поля такого типа, как он генерируется из вызова метода, или что-то другое? – Servy

ответ

23

«Легкий» вариант был бы просто перебирать список в обратном порядке без фактического изменения самого списка, вместо того, чтобы пытаться обратить его в первый раз и знаю, чтобы сделать ничего в другие времена:

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

используя метод вместо List Reverse LINQ Reverse, мы можем перебирать его назад без мутирует списка. AsEnumerable должен быть там, чтобы предотвратить использование метода ListReverse.

+0

Вот что я искал! спасибо Linq !!! ... и Servy конечно :) –

6

Вы спрашиваете, как создать перевернутую копию списка, не мутирует оригинал.

LINQ можно сделать:

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

Вы можете сделать одну из двух вещей. Либо вынуть реверсивный список из метода и обратный список один раз перед вызовом метода в четыре раза, или сделать:

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

Это делает копию списка перед разворотом его, чтобы вы не трогайте первоначальный список ,

Я бы рекомендовал первый подход, потому что прямо сейчас вы вызываете Обратный четыре раза вместо одного раза.

1

Все предоставленные варианты до сих пор внутренне копируют все элементы в другой список в обратном порядке, явно как new_list.Reverse() или неявные t.List.AsEnumerable().Reverse(). Я предпочитаю то, что не так дорого, как метод расширения ниже.

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

И можно было бы использовать в качестве

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

}