Поддерживают ли перечисляемые методы LINQ относительный порядок элементов?

Скажем, у меня есть List<Foo> foos, где важен текущий порядок элементов. Если я затем применяю метод LINQ Enumerable, такой как GroupBy, Where или Select, могу ли я полагаться на то, что результирующий IEnumerable<Foo> будет повторяться в том же относительном порядке, что и исходный список?


person verdesmarald    schedule 27.05.2011    source источник
comment
Я не буду пытаться отвечать на ваш вопрос напрямую, потому что @Mehrdad уже хорошо с этим справился, но если вы действительно хотите понять, что Linq делает под прикрытием, взгляните на превосходный серия сообщений в блоге EduLinq.   -  person Andrew Cooper    schedule 27.05.2011
comment
См. Также stackoverflow.com/questions/204505/preserving-order-with- linq   -  person goodeye    schedule 28.11.2012


Ответы (1)


Да, для Enumerable методов (LINQ to Objects, который применяется к List<T>, о котором вы упомянули), вы можете полагаться на порядок элементов, возвращаемых Select, Where или GroupBy. Это не относится к вещам, которые изначально неупорядочены, например ToDictionary или Distinct.

Из документации Enumerable.GroupBy:

Объекты IGrouping<TKey, TElement> выдаются в порядке, основанном на порядке элементов в источнике, которые создали первый ключ каждого IGrouping<TKey, TElement>. Элементы в группе отображаются в том порядке, в котором они появляются в source.

Это не обязательно верно для IQueryable методов расширения (других поставщиков LINQ).

person mmx    schedule 27.05.2011