Я хочу создать обобщенный метод для сортировки любого списка по любой переменной.
Например. У меня есть объект Student и Class:
Order(studentList, s => s.Name, desc)
Order(classList, s => s.ClassName, desc)
Я попытался создать частный метод для этого:
private List<T> Order<T, TKey>(List<T> listToOrder, Expression<Func<T, TKey>> sortKey, bool desc)
{
return desc ? listToOrder.OrderByDescending(sortKey) : listToOrder.OrderBy(sortKey)
}
Но это явно не работает. Любые идеи, как я могу этого добиться? Отредактирует ответ, если его недостаточно.
Кажется, ваш метод предполагает, что T
является списком, а также параметром типа... а методы OrderBy
и OrderByDescending
не возвращают списки, они возвращают последовательности. Далее, «это, очевидно, не работает» не так описательно, как полное описание того, что вы видите. Наконец, я бы предложил использовать здесь только Func<T, TKey>
, а не деревья выражений, если только вам действительно не нужны деревья выражений по какой-то причине, о которой вы нам не сказали.
Работает без Expression! Большое спасибо :)
Я вообще не вижу никакого преимущества в создании этой функции, поскольку все, что она делает, это вызывает либо OrderByDescending
, либо OrderBy
. Кроме этого, я не понимаю, почему ваш код не должен работать. Пожалуйста, уточните вашу проблему.
Почему вы используете Expression<Func<T, TKey>>
вместо простого Func<T, TKey>
? Обычно Expression<Func<T, TKey>>
используется, когда у вас есть IQueryable<T>
, но у вас его нет.
Я также предлагаю вам изменить bool desc
на enum SortDirection { Ascending, Descending }
. Тогда ваш код читаем. Order(list, x => x.Name, false)
менее читаем, чем Order(list, x => x.Name, SortDirection.Descending)
.
Если ваши значения Student
и Class
собраны, вы можете попробовать написать метод расширения
IOrderedEnumerable<T>
, какой тип из OrderBy
и OrderByDescending
.Expression
просто используйте делегат Func<T, TKey>
будет достаточнокак показано ниже
public static class MyExtesion{
public static IOrderedEnumerable<T> Order<T, TKey>(this IEnumerable<T> source,Func<T, TKey> sortKey, bool desc)
{
return desc ? source.OrderByDescending(sortKey) : source.OrderBy(sortKey);
}
}
Если я правильно понимаю, попробуйте следующее:
public static List<T> Order<T>(List<T> listToOrder, Func<T, int> sortFunc, bool desc)
{
return desc ?
listToOrder.OrderByDescending(x => sortFunc(x)).ToList() : listToOrder.OrderBy(x => sortFunc(x)).ToList();
}
Ниже приведены тестовые коды:
var arr1 = new int[] {1,-1,2,-2,0,3,-3};
var result = LogHelper.Order(arr1.ToList(),x=>x*x,false);
Просто зарегистрируйте их.
Что не работает? У вас есть исключение?