我有一个通用列表,正在被调用4次的方法中使用。此方法使用此通用列表的值在PDF中写入表。
我的问题是我需要在方法中反转这个通用列表,但我调用方法4次,所以每次调用方法时列表都被反转,我不想那个......什么我可不可以做?有没有办法在不改变原文的情况下反转列表?
这是方法内部:
t.List.Reverse();
foreach (string t1 in t.List)
{
//Some code
}
答案 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()) {
}