我有一个在被调用 4 次的方法中使用的通用列表。此方法使用此通用列表的值在 PDF 中写入一个表。
我的问题是我需要在方法中反转这个通用列表,但是我调用该方法 4 次,所以每次调用该方法时列表都会被反转,我不希望那样......我能做什么? 有没有办法在不改变原始列表的情况下反转列表?
这是在方法内部:
t.List.Reverse();
foreach (string t1 in t.List)
{
//Some code
}
我有一个在被调用 4 次的方法中使用的通用列表。此方法使用此通用列表的值在 PDF 中写入一个表。
我的问题是我需要在方法中反转这个通用列表,但是我调用该方法 4 次,所以每次调用该方法时列表都会被反转,我不希望那样......我能做什么? 有没有办法在不改变原始列表的情况下反转列表?
这是在方法内部:
t.List.Reverse();
foreach (string t1 in t.List)
{
//Some code
}
“简单”选项将只是以相反的顺序迭代列表而不实际更改列表本身,而不是第一次尝试反转它并且知道其他时候什么都不做:
foreach (string t1 in t.List.AsEnumerable().Reverse())
{
//Some code
}
通过使用 LINQReverse
方法而不是List
Reverse,我们可以向后迭代它而不改变列表。AsEnumerable
需要在那里以防止使用该方法List
Reverse
。
您正在询问如何创建列表的反向副本,而不改变原始副本。
LINQ 可以做到这一点:
foreach (var t1 in Enumerable.Reverse(t.List))
你可以做两件事之一。从方法中取出反转列表并在四次调用该方法之前反转一次列表,或者执行以下操作:
List<My_Type> new_list = new List<Int32>(t.List);
new_list.Reverse();
这会在反转之前获取列表的副本,这样您就不会触及原始列表。
我会推荐第一种方法,因为现在你调用 Reverse 四次而不是一次。
到目前为止,所有给定的选项在内部以相反的顺序将所有元素复制到另一个列表,显式 asnew_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()) {
}