Как изменить общий список без изменения одного и того же списка?
У меня есть общий список, который используется внутри метода, который называется 4 раза. Этот метод записывает таблицу в PDF со значениями этого общего списка.
Моя проблема в том, что мне нужно отменить этот общий список внутри метода, но я вызываю метод 4 раза, чтобы список менялся каждый раз, когда я вызываю метод, и я не хочу этого... что я могу сделать? Есть ли способ изменить список без изменения оригинала?
Это внутри метода:
t.List.Reverse();
foreach (string t1 in t.List)
{
//Some code
}
Ответы
Ответ 1
"Легкий" вариант состоял бы в том, чтобы просто перебрать список в обратном порядке, не изменяя сам список, вместо того, чтобы пытаться изменить его в первый раз и знать, чтобы ничего не делать в других случаях:
foreach (string t1 in t.List.AsEnumerable().Reverse())
{
//Some code
}
Используя метод LINQ Reverse
вместо List
Reverse, мы можем перебирать его назад, не изменяя список. AsEnumerable
должен быть там, чтобы предотвратить использование метода List
Reverse
.
Ответ 2
Вы спрашиваете, как создать обратную копию списка без изменения оригинала.
LINQ может это сделать:
foreach (var t1 in Enumerable.Reverse(t.List))
Ответ 3
Вы можете сделать одну из двух вещей. Либо выверните список из метода и отмените список один раз, прежде чем вызывать метод четыре раза, или выполните:
List<My_Type> new_list = new List<Int32>(t.List);
new_list.Reverse();
Это займет копию списка, прежде чем перевернуть его, чтобы вы не коснулись исходного списка.
Я бы рекомендовал первый подход, потому что прямо сейчас вы вызываете Reverse четыре раза, а не только один раз.
Ответ 4
Все указанные параметры до сих пор внутренне копируют все элементы в другой список в обратном порядке, явно как 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()) {
}