Почему-то 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);