【问题标题】:How to reverse a generic list without changing the same list?如何在不更改相同列表的情况下反转通用列表?
【发布时间】:2013-09-30 19:16:45
【问题描述】:

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

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

这是在方法内部:

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

【问题讨论】:

  • 是传入的列表,是该类型的实例字段,是通过调用方法生成的,还是别的什么?

标签: c# reverse generic-list


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    LINQ 可以做到这一点:

    foreach (var t1 in Enumerable.Reverse(t.List))
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2018-04-05
          • 1970-01-01
          • 2022-11-05
          • 2017-01-22
          • 1970-01-01
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多