如何在不更改同一列表的情况下反转泛型列表

本文关键字:列表 情况下 泛型 | 更新日期: 2023-09-27 18:33:18

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

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

这是在方法内部:

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

如何在不更改同一列表的情况下反转泛型列表

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

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

通过使用 LINQ Reverse 方法而不是 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 四次,而不仅仅是一次。

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