为什么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.Reverse的唯一方法是将其转换或转换为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);