11

我有问题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

因为-Part1Reverse()List<T>.Reverse()Reverse()-Part2 是Reverse(this IEnumerable<TSource> source) 我想List<int>.Reverse()在 Part2 中执行IList<int>。我该怎么做?

4

2 回答 2

10

IList<int>没有Reverse方法,所以它使用扩展方法。List<T>.Reverse在您的参考中使用的唯一方法IList<int>是将其转换或转换为List<int>. 只有当您确定它确实是 a 时,铸造才会起作用List<int>

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

另一种选择是从您的实例创建a ,而不是假设它已经是 a :List<int>IList<int>List<int>

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

扩展方法实际上不会影响底层列表的原因是因为它在 上操作,不一定是可写的(扩展方法都不会更改原始集合,它们会返回一个集合)。ReverseIEnumerable<T>Enumerable

要使用这个版本Reverse,只需使用Reverse调用的产品,而不是原始列表:

IList<int> abstractList;
IEnumerable<int> reversedList = abstractList.Reverse();
于 2011-01-12T19:32:57.913 回答
4

在第二个示例中,您使用了针对 的扩展方法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);
于 2011-01-12T19:39:16.603 回答