问题 为什么IList 。Reverse()不像List ()那样工作。反向


我有问题 List<T>.Reverse() 和 Reverse(this IEnumerable<TSource> source)。 看看代码:

  // Part 1
  List<int> list = new List<int> { 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<int> 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<T>.Reverse()Reverse()-Part2是 Reverse(this IEnumerable<TSource> source) 我想要执行 List<int>.Reverse() 在第2部分中 IList<int>。我怎么能这样做?


10383
2018-01-12 19:29


起源

我同意你的观点,这令人困惑。 - Dan Tao


答案:


IList<int> 没有 Reverse 方法,所以它使用扩展方法。唯一的使用方法 List<T>.Reverse 在你的 IList<int> 引用是将其转换或转换为 List<int>。只有当你确定它真的是一个时,铸造才会有效 List<int> 首先:

IList<int> abstractList;
var concreteList = (List<int>)abstractList;
concreteList.Reverse();

另一种选择是 创建 一个 List<int> 从你的 IList<int> 例如,而不是假设它已经是一个 List<int>

IList<int> abstractList;
var concreteList = new List<int>(abstractList);
concreteList.Reverse();

原因 那个 Reverse 扩展方法实际上并不影响基础列表是因为它操作 IEnumerable<T>,这不一定是可写的(没有 Enumerable 扩展方法对原始集合进行更改,它们返回一个  采集)。

要使用此版本 Reverse,只需使用该产品 Reverse 呼叫,而不是原始列表:

IList<int> abstractList;
IEnumerable<int> reversedList = abstractList.Reverse();

9
2018-01-12 19:32





在第二个示例中,您正在使用扩展方法 IEnumerable<T>,这不会改变原始集合,而是产生一个查询,该查询将以相反的顺序生成原始列表的序列。也就是说,如果你想利用结果 ilist.Reverse(),你会说

var reversedList = iList.Reverse(); 
// reversedList is IEnumerable<int>
// 'list' and 'ilist' are not changed

foreach (int item in reversedList)
    Console.Write(item);

4
2018-01-12 19:39



简短但简洁的回答手头的问题。帮帮我了谢谢+1 - Moe Howard