LINQ to Objects сохраняет свой заказ
У меня есть List<Person>
и вместо этого хочу преобразовать их для простой обработки в List<string>
, выполнив следующее:
List<Person> persons = GetPersonsBySeatOrder();
List<string> seatNames = persons.Select(x => x.Name).ToList();
Console.WriteLine("First in line: {0}", seatNames[0]);
Является ли оператор .Select()
объекта LINQ to Objects гарантированным не изменять порядок членов списка? Предполагая, что явное выделение/группировка/упорядочение не добавляется
Кроме того, если вначале используется произвольное предложение .Where()
, сохраняется ли сохранение относительного порядка или иногда используется нетеративная фильтрация?
Как заметил Фермин выше, это, по сути, дублирующий вопрос. Я не смог выбрать правильные ключевые слова для поиска stackoverflow
Сохранение заказа с LINQ
Ответы
Ответ 1
В текущей реализации .Net он использует такой код. Но нет никакой гарантии, что эта реализация будет в будущем.
private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector)
{
int index = -1;
foreach (TSource source1 in source)
{
checked { ++index; }
yield return selector(source1, index);
}
}
Ответ 2
Это больше зависит от типа базовой коллекции. Вы можете получить непоследовательное упорядочение из HashSet, но список безопасен. Даже если заказ, который вы хотите, предоставляется неявно, лучше определить явный порядок, если вам это нужно. Похоже, вы делаете это, судя по именам методов.