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

标签 c# list interface methods ambiguity

我对 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() -第 1 部分是 List<T>.Reverse() , Reverse() -第 2 部分是 Reverse(this IEnumerable<TSource> source) 我要执行 List<int>.Reverse()在第 2 部分中 IList<int> .我该怎么做?

最佳答案

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();

关于c# - 为什么 IList<>.Reverse() 不像 List<>().Reverse 那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673136/

相关文章:

c# - Winforms:Winforms 应用程序的键盘快捷键在其面板中托管其他应用程序

c# - linq ASP.NET MVC 存储库模式的最佳实践是什么

python - 在 Python 中映射名称

c# - 在 C++ 中实现接口(interface)?

c# - Linq查询获得唯一性和排序

c# - 如何使用 C# 从 PDF 或 XPS 中提取具有格式的文本?

list - 将 SQFlite 中的数据显示到网格列表(Flutter)中?

excel - 如何在Excel中根据多个特定文本设置条件格式

c# - 混合封装和依赖注入(inject)

android - 我怎样才能有 2 个不同的 fragment ,实现相同的方法而无需编写两次代码?