如何在不更改相同列表的情况下反转通用列表?

时间:2013-09-30 19:16:45

标签: c# reverse generic-list

我有一个通用列表,正在被调用4次的方法中使用。此方法使用此通用列表的值在PDF中写入表。

我的问题是我需要在方法中反转这个通用列表,但我调用方法4次,所以每次调用方法时列表都被反转,我不想那个......什么我可不可以做?有没有办法在不改变原文的情况下反转列表?

这是方法内部:

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

4 个答案:

答案 0 :(得分:27)

“简单”选项是以相反的顺序迭代列表,而不是实际更改列表本身,而不是第一次尝试反转它,并且知道其他时间什么都不做:

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

通过使用LINQ Reverse方法而不是List Reverse,我们可以向后迭代它而不会改变列表。 AsEnumerable需要在那里以防止使用List Reverse方法。

答案 1 :(得分:6)

您正在询问如何创建列表的反转副本,而不会改变原始内容。

LINQ可以做到这一点:

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

答案 2 :(得分:1)

你可以做两件事之一。从方法中取出反转列表并在调用方法四次之前反转列表,或者执行:

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

在翻转之前会获取列表的副本,因此您不会触摸原始列表。

我会推荐第一种方法,因为现在你正在调用Reverse四次而不只是一次。

答案 3 :(得分: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()) {

}