C# 通用排序依据
C# generlized order by
我想创建一个通用方法,用于按任何类型的变量对任何类型的列表进行排序。
例如我有一个学生和一个 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)
}
但这显然行不通。有什么想法可以实现吗?如果不够充分,将编辑答案。
如果你的Student
&Class
值被收集了,你可以尝试写一个扩展方法
- return 类型可能是
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);
只需记录它们。
我想创建一个通用方法,用于按任何类型的变量对任何类型的列表进行排序。
例如我有一个学生和一个 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)
}
但这显然行不通。有什么想法可以实现吗?如果不够充分,将编辑答案。
如果你的Student
&Class
值被收集了,你可以尝试写一个扩展方法
- return 类型可能是
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);
只需记录它们。