如何在不改变原列表的情况下反转一个通用列表?

16

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

我的问题是,我需要在该方法内反转此通用列表,但我正在调用该方法4次,因此每次调用该方法都会翻转该列表,而我不希望出现这种情况...我该怎么办? 有没有一种方法可以在不改变原始列表的情况下反转列表?

这是在方法内部的内容:

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

传递进来的列表,是该类型的实例字段吗?还是从方法调用生成的?或者其他什么情况? - Servy
4个回答

39

“简单”的方法是在不改变列表本身的情况下以相反的顺序迭代该列表,而不是尝试在第一次反转列表时并知道在其他时间什么也不做:

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

使用LINQ的Reverse方法而不是List的Reverse方法,我们可以在不改变列表的情况下反向迭代它。需要使用AsEnumerable来防止使用ListReverse方法。


7
您正在询问如何创建列表的反向副本,而不改变原始列表。
LINQ可以做到这一点:
foreach (var t1 in Enumerable.Reverse(t.List))

0

到目前为止,所有给定的选项都会在内部将所有元素复制到另一个列表中并以相反的顺序显示,显式地使用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()) {

}

0

你可以选择两种方法。一种是将列表反转的操作从该方法中移除,并在调用该方法四次之前先反转列表一次;另一种是:

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

这会在反转列表之前复制列表,以便您不会触及原始列表。

我建议使用第一种方法,因为现在您正在调用四次Reverse而不是一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接