2009-07-17 2 views
2

Кто-нибудь знает, есть ли какие-либо встроенные возможности в библиотеке LINQ (или общедоступной утилите) для оптимизированных операций на IOrderedEnumerable<T>, а не IEnumerable<T>?Оптимизация LINQ для IOrderedEnumerable

Например, теоретически расширение Contains<T>() потенциально может быть оптимизировано для использования бинарного поиска, когда оно применяется к конечному IOrderedEnumerable<T>, а T является IComparable.

Другим примером может быть оптимизированная версия Distinct<T>(), которая будет отложена и потокобезопасна (поскольку в упорядоченной сопоставимой коллекции вы всегда можете использовать методы пропуска/совпадения для создания отдельного набора).

ответ

6

Есть проблемы там ...

  • бинарный поиск не может быть выполнен на IOrderedEnumerable<T>, так как он идеально необходим доступ индексатор в список/массив. Так что было бы назвать что-то вроде ToList()/ToArray() первые
  • Distinct работ по T предметов, но OrderBy работ на некоторых фаской каждого T - это не совсем то же самое, если не случится знать, что это по заказу от item=>item; что редко бывает (и трудно доказать).
+0

Отличные баллы ... Я не рассматривал последствия того, что заказ коллекции может означать во всех случаях. – LBushkin

+1

Nitpick: вам не нужно знать, что он упорядочен элементом item =>, если вы знаете, что IEqualityComparer передан Distinct, подчиняется тем же самым заказам, что и OrderBy. Как вы говорите, вы не можете знать это во всех случаях. Я думаю, вы могли бы захватить IComparer, используемый OrderBy/ThenBy, и использовать его, но это, скорее всего, слишком много работает. –