Будет ли 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>
, Упорядоченная коллекция теперь является источником итератора, но не самого итератора.