为什么IList 。Reverse()不像List ()那样工作。反向
我有List.Reverse()
和Reverse(this IEnumerable source)
。 看看代码:
// Part 1 List list = new List { 1, 2, 3 }; foreach (int x in list) Console.Write(x); Console.WriteLine(); list.Reverse(); foreach (int x in list) Console.Write(x); Console.WriteLine(); list.Reverse(); // Part2 IList ilist = list; foreach (int x in list) Console.Write(x); Console.WriteLine(); ilist.Reverse(); foreach (int x in ilist) Console.Write(x); Console.WriteLine(); ilist.Reverse();
我的结果:
123 321 123 123
因为Reverse()
Part1是List.Reverse()
, Reverse()
Part2是Reverse(this IEnumerable source)
我想在Part2中为IList
执行List.Reverse()
。 我怎么能这样做?
IList
没有Reverse
方法,因此它使用扩展方法。 在IList
引用上使用List
的唯一方法是将其转换或转换为List
。 只有当你确定它首先是List
,才能使用强制转换:
IList abstractList; var concreteList = (List )abstractList; concreteList.Reverse();
另一种选择是从IList
实例创建 List
,而不是假设它已经是List
:
IList abstractList; var concreteList = new List (abstractList); concreteList.Reverse();
Reverse
扩展方法实际上不影响基础列表的原因是因为它在IEnumerable
,这不一定是可写的( Enumerable
扩展方法都没有对原始集合进行更改,它们返回一个新集合)。
要使用此版本的Reverse
,只需使用Reverse
调用的产品,而不是原始列表:
IList abstractList; IEnumerable reversedList = abstractList.Reverse();
在第二个示例中,您正在使用针对IEnumerable
的扩展方法,并且这不会改变原始集合,而是生成一个查询,该查询将以相反的顺序生成原始列表的序列。 也就是说,如果你想利用ilist.Reverse()
的结果,你会说
var reversedList = iList.Reverse(); // reversedList is IEnumerable // 'list' and 'ilist' are not changed foreach (int item in reversedList) Console.Write(item);