'然后'使用不同数量的标准

Ela*_*der 4 c# sorting criteria sql-order-by

我正在编写一个C#程序,允许用户指定排序标准.例如,用户只能按"serviceName"排序,或添加其他几个标准,如"isHD"或"isGood".我要问的是,我想使用'.Then By'语句,但用户确定我需要写多少次.

有什么方法可以根据开关/案例块在标准数量上获得一些灵活性?例如

List.OrderBy(t => t.name)
List.OrderBy(t => t.isHD).ThenBy(t => t.name)
List.OrderBy(t => t.isGood).ThenBy(t => t.name).ThenBy(t => t.isHD)
Run Code Online (Sandbox Code Playgroud)

此外,这些标准的顺序将由用户选择.

Kam*_*ski 6

你可以使用泛型方法:

    public List<T> SortBy<T>(List<T> list, params Func<T, object>[] selectors)
    {
        var ordered = list.OrderBy(selectors[0]);
        for (int i = 1; i < selectors.Count(); i++)
        {
            ordered= ordered.ThenBy(selectors[i]);
        }
        return ordered.ToList();
    }
Run Code Online (Sandbox Code Playgroud)

运行:

SortBy(List, x=>x.name, x=>x.isHD, x=>x.isGood)
Run Code Online (Sandbox Code Playgroud)

这将做:

List.OrderBy(x=>x.name).ThenBy(x=>x.isHD).ThenBy(x=>x.isGood)
Run Code Online (Sandbox Code Playgroud)

可以通过检查选择器是否通过来改进

  • 由于`ordered`变量未在循环体中分配,因此不会应用任何`ThenBy`排序.即循环体应为:`ordered = ordered.ThenBy(selectors [i]);` (2认同)
  • 不幸的是,除非您想要传递多个选择完全相同类型的选择器,否则它将无法正常工作.如果你想传递不同的类型选择器,那么它必须是`Func <T,object>`而没有第二个类型参数`TU`. (2认同)