14

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

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

这是在方法内部:

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

4 回答 4

35

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

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

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

于 2013-09-30T19:19:51.257 回答
7

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

LINQ 可以做到这一点:

foreach (var t1 in Enumerable.Reverse(t.List))
于 2013-09-30T19:19:42.257 回答
0

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

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

这会在反转之前获取列表的副本,这样您就不会触及原始列表。

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

于 2013-09-30T19:21:39.203 回答
0

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

}
于 2017-08-09T18:12:58.863 回答