Как указать направление OrderBy LINQ как логическое значение?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как указать направление OrderBy LINQ как логическое значение?

Сообщение Anonymous »

У меня есть простой класс данных с такой сигнатурой:

Код: Выделить всё

internal interface IMyClass {
string Letter { get; }
int Number { get; }
}
Я хочу иметь возможность сортировать эти данные на основе поля (указанного как строка sortField) и направления (указанного как bool isAscending) )

В настоящее время я использую переключатель (с восходящей логикой внутри каждого случая, как если бы)

Код: Выделить всё

IEnumerable lst = new IMyClass[];//provided as paramater
switch (sortField)
{
case "letter":
if( isAscending ) {
lst = lst.OrderBy( s => s.Letter );
} else {
lst = lst.OrderByDescending( s => s.Letter );
}
break;
case "number":
if( isAscending ) {
lst = lst.OrderBy( s => s.Number );
} else {
lst = lst.OrderByDescending( s => s.Number );
}
break;
}
Это довольно некрасиво для двух свойств, но когда логика сортировки различается, это становится проблемой (мы также видим, что s => s.Number дублируется дважды в коде)

Вопрос
Как лучше всего передать логическое значение для выбора направления сортировки?

Что у меня есть Попробовал
Я разорвал System.Core.dll и нашел реализации метода расширения OrderBy:

OrderBy:

Код: Выделить всё

public static IOrderedEnumerable OrderBy(
this IEnumerable source,
Func keySelector
){

return new OrderedEnumerable(
source,
keySelector,
null,
false
);
}
OrderByDescending:

Код: Выделить всё

public static IOrderedEnumerable OrderByDescending(
this IEnumerable source,
Func keySelector
){
return new OrderedEnumerable(
source,
keySelector,
null,
true
);
}
Похоже, что цель наличия двух именованных методов состоит в том, чтобы абстрагировать это логическое значение. Я не могу легко создать собственное расширение, поскольку OrderedEnumberable является внутренним для System.Core, и написание слоя для перехода от bool -> имя_метода -> bool кажется мне неправильным.

Подробнее здесь: https://stackoverflow.com/questions/117 ... -a-boolean
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»