我对 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/