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值被收集了,你可以尝试写一个扩展方法

  1. return 类型可能是 IOrderedEnumerable<T> 类型 OrderBy & OrderByDescending.
  2. 你可能不需要使用 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);

只需记录它们。