Я исследовал методы System.Linq.Enumerable , отбрасывая все, которые возвращали не-IEnumerable результаты. Я проверил замечания каждого из них, чтобы определить, как порядок результата будет отличаться от порядка источника.
Сохраняет заказ Абсолютно. Вы можете сопоставить исходный элемент по индексу с результирующим элементом
- AsEnumerable
- Cast
- Concat
- Выберите
- ToList
Заказ на консервы. Элементы фильтруются, но не переупорядочиваются.
- Четкая
- За исключением
- Intersect
- Пропустить
- SkipWhile
- Take
- Где * * 1040
- Zip (новый в .net 4)
Уничтожает ордер - мы не знаем, в каком порядке ожидать результаты.
Явно переопределяет порядок - используйте их для изменения порядка результата
- OrderBy
- OrderByDescending
- Реверс
- ThenBy
- ThenByDescending
Переопределение заказа в соответствии с некоторыми правилами.
- GroupBy - объекты IGrouping выдаются в порядке, основанном на порядке элементов в источнике, который создал первый ключ каждой IGrouping. Элементы в группировке приводятся в порядке их появления в источнике.
- GroupJoin - GroupJoin сохраняет порядок элементов внешнего, а для каждого элемента внешнего - порядок соответствия элементов из внутреннего.
- Join - сохраняет порядок элементов external, а для каждого из этих элементов порядок соответствия элементов inner.
- SelectMany - для каждого элемента источника вызывается селектор и возвращается последовательность значений.
- Union - при перечислении объекта, возвращаемого этим методом, Union перечисляет первый и второй в этом порядке и возвращает каждый элемент, который еще не был получен.
Редактировать: я переместил Distinct в Сохранение порядка на основе этой реализации .
private static IEnumerable<TSource> DistinctIterator<TSource>
(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}