Как изменить общий список без изменения одного и того же списка?

У меня есть общий список, который используется внутри метода, который называется 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()) {

}