Здравствуйте, i1yich, Вы писали:
I>Можно ли в качестве keySelector при вызове IEnumerable.OrderBy использовать недетерминированную функцию, т.е. такую, которая не обязательно вернет один и тот же ключ, будучи вызвана дважды для одного элемента?
I>С одной стороны, то, что OrderBy вычисляет и кеширует ключи элементов перед сортировкой — это вроде деталь реализации, но с другой — в документации к OrderBy на keySelector не налагается никаких требований, кроме того чтобы для возвращаемых значений ключа существовал Comparer<TKey>.Default.
Я к чему спрашиваю, вот например в задаче, когда нужно перечислить последовательность в случайном порядке, если полагаться на кеширование ключей, код будет выглядеть достаточно просто:
public static IEnumerable<T> RandomOrder<T>(this IEnumerable<T> source)
{
var rnd = new Random();
return source.OrderBy(_ => rnd.Next());
}
Если же "ключ" элемента равный rnd.Next, будет вычисляться при каждом сравнении, то некоторые алгоритмы сортировки могут и не закончиться за предсказуемое время!