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