我有问题 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>
。我怎么能这样做?
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();
在第二个示例中,您正在使用扩展方法 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);