Будет ли IOrderedEnumerable.Select() сохранять порядок элементов?

В C# будет использовать Select() проецировать элементы IOrderedEnumerable сохранить порядок элементов?

  • Если так, то почему IEnumerableи не IOrderedEnumerable?
  • Если нет, как я могу достичь этого (кроме использования foreach)?

Обратите внимание, что этот вопрос не является дубликатом этого - у меня есть только Select() оговорка, без Distinct(),

РЕДАКТИРОВАТЬ

Да, это LINQ to Objects. Кстати, был бы другой ответ, если бы я на самом деле запрашивал какую-то базу данных SQL?

1 ответ

Решение

Select не меняет порядок элементов. Это оператор потоковой передачи (MSDN), что означает, что он обрабатывает исходные элементы в порядке источника и выдает проецируемые элементы один за другим.

Таким образом, если вы делаете проекцию упорядоченного источника, спроецированные результаты сохранят порядок элементов источника.


Еще одна вещь - вы можете быть удивлены, почему результат не реализуется IOrderedEnumerable<T>:

int[] items = { 2, 3, 1, 8, 5 };
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i);
bool isOrdered = query is IOrderedEnumerable<int>; // false

Это потому что Select оператор возвращает новый объект итератора (WhereSelectArrayIterator в этом случае), который читает элементы из исходной коллекции (OrderedEnumerable в этом случае) один за другим проектирует элемент и возвращает проекцию. Этот новый объект итератора не реализует IOrderedEnumerable<T> интерфейс, это просто IEnumerable<T>, Упорядоченная коллекция теперь является источником итератора, но не самого итератора.

Другие вопросы по тегам