Почему-то IList.Reverse () не работает как List ().Обратный
у меня проблема с 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>
. Как я могу это сделать?
2 ответов
IList<int>
нет Reverse
метод, поэтому он использует метод расширения. Единственный способ использовать List<T>.Reverse
на IList<int>
ссылка состоит в том, чтобы бросить или преобразовать его в List<int>
. Кастинг будет работать только если вы уверены, что это действительно List<int>
в первую очередь:
IList<int> abstractList;
var concreteList = (List<int>)abstractList;
concreteList.Reverse();
и создать a 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);