首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么IList<>.Reverse()不像List<>().Reverse那样工作

为什么IList<>.Reverse()不像List<>().Reverse那样工作
EN

Stack Overflow用户
提问于 2011-01-13 03:29:59
回答 2查看 10.2K关注 0票数 11

我对List<T>.Reverse()Reverse(this IEnumerable<TSource> source)有意见。查看代码:

代码语言:javascript
复制
  // 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();

我的结果是:

代码语言:javascript
复制
123
321
123
123

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-13 03:32:58

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

代码语言:javascript
复制
IList<int> abstractList;
var concreteList = (List<int>)abstractList;
concreteList.Reverse();

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

代码语言:javascript
复制
IList<int> abstractList;
var concreteList = new List<int>(abstractList);
concreteList.Reverse();

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

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

代码语言:javascript
复制
IList<int> abstractList;
IEnumerable<int> reversedList = abstractList.Reverse();
票数 10
EN

Stack Overflow用户

发布于 2011-01-13 03:39:17

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

代码语言:javascript
复制
var reversedList = iList.Reverse(); 
// reversedList is IEnumerable<int>
// 'list' and 'ilist' are not changed

foreach (int item in reversedList)
    Console.Write(item);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4673136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档