Если вы используете простые LINQ-to-объекты и не хотите получать зависимость от внешней библиотеки, нетрудно достичь того, что вы хотите.
Предложение OrderBy()
принимает Func<TSource, TKey>
, который получает ключ сортировки из исходного элемента. Вы можете определить функцию вне предложения OrderBy()
:
Func<Item, Object> orderByFunc = null;
Затем вы можете присвоить его различным значениям в зависимости от критериев сортировки:
if (sortOrder == SortOrder.SortByName)
orderByFunc = item => item.Name;
else if (sortOrder == SortOrder.SortByRank)
orderByFunc = item => item.Rank;
Тогда вы можете отсортировать:
var sortedItems = items.OrderBy(orderByFunc);
В этом примере предполагается, что тип источника Item
со свойствами Name
и Rank
.
Обратите внимание, что в этом примере TKey
равно Object
, чтобы не ограничивать типы свойств, по которым можно сортировать. Если функция возвращает тип значения (например, Int32
), она будет упакована при сортировке, и это несколько неэффективно. Если вы можете ограничить TKey
определенным типом значения, вы можете обойти эту проблему.