2013-09-30 16 views
10

我有一个正在一个是被呼叫4倍方法中使用的通用的清单。此方法使用此通用列表的值在PDF中编写表。如何扭转不改变同一列表中的泛型列表?

我的问题是,我需要扭转的方法这里面通用的清单,但我打电话的方法4次这样的名单被逆转我每次调用该方法,我不希望到时候...我能做什么?有没有办法在不改变原始的情况下反转列表?

这是里面的方法:

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

正在被传递的列表,这是该类型的实例字段,它是从一种方法,还是其他什么东西通话产生的? – Servy

回答

23

“易”的办法是只遍历以相反的顺序列表而不实际改变列表本身,而不是试图扭转它首次知道该怎么办没有其他时间:

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

通过使用LINQ Reverse方法,而不是List反转,我们可以向后遍历它没有变异的名单。所述AsEnumerable需要在那里,以防止ListReverse方法被使用。

+0

这就是我一直在寻找的!谢谢Linq !!! ...和Servy当然:) –

6

你询问如何创建列表的反转副本,但没有突变原。

LINQ可以这样做:

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

你可以做两件事情之一。无论是采取了倒车从方法列表,并调用该方法四次,前一次反向列表,或做:

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

,是以列表的副本扭转之前,所以你不要触摸原始列表。

,因为现在你正在呼吁反四倍,而不是只一次,我会建议第一种方法。

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()) { 

}