Соблюдает ли пункт LINQ Where порядок? - PullRequest
5 голосов
/ 28 марта 2012

Когда я использую предложение LINQ Где, соответствует ли возвращенный список элементов тому порядку, в котором они были в исходном списке?

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Зависит от того, как реализована запрашиваемая коллекция GetEnumerator.Если GetEnumerator выполняет итерацию по коллекции в добавленном порядке, то она будет соблюдать порядок.

ОБНОВЛЕНИЕ :

Вот пример, который я добавил вместе с LINQPad:

var items = new List<int>() { 1,2,3,4,5 };
items.Insert(3, 100);

(from i in items
 where i > 2
 select i).Dump();

РЕЗУЛЬТАТ:

3 
100
4
5

Итак, условие Where учитывает порядок элементов в списке, поскольку List GetEnumerator начинается с первого элемента в спискеи продолжается до конца.

2 голосов
/ 28 марта 2012

Где обрабатывает предметы в заказе IEnumerable<T> дает. Если вы запрашиваете реализацию IEnumerable<T>, которая сохраняет порядок, в котором они вставлены (например, List<T>), то вы сохраняете порядок. Если вы запрашиваете HashTable<T>, например, заказ не гарантируется.

1 голос
/ 28 марта 2012

Предложение LINQ where переводится в вызов метода Where().Если в вашем списке реализован IEnumerable<T> и нет лучшего метода Where() (в большинстве случаев его нет), это означает, что вызывается метод расширения Enumerable.Where().

Как ни странно, этот метод не задокументирован как возвращающий элементы по порядку, но это то, что он делает на практике, и я думаю, что вы можете положиться на это.

Если для рассматриваемой коллекции, то другая реализация Where() используется (особенно для IQueryable<T>, это Queryable.Where()), у вас больше нет этой гарантии, и where не должен выполнять какой-либо приказ.Например, поставщики SQL обычно этого не делают.

...