Re: OrderBy и недетерминированный keySelector
От: i1yich  
Дата: 31.05.11 09:35
Оценка:
Здравствуйте, 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, будет вычисляться при каждом сравнении, то некоторые алгоритмы сортировки могут и не закончиться за предсказуемое время!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.