LINQ 如何动态使用多个ThenBy?

MrC*_*lan 5 .net c# linq sorting

我没想到这会如此罕见,但看起来确实如此。情况是这样的。

我有一个ApplySort方法,它接受从 mvc 页面发布的 3 个参数。

    private List<dynamic> ApplySort(List<dynamic> listToBeSorted, string sortBy, string sortOrder)
    {
        if (String.IsNullOrEmpty(sortBy))
            sortBy = "createddate";
        if (String.IsNullOrEmpty(sortOrder) || sortOrder.Trim() != "0")
            sortOrder = "1"; // 1 = descending, 0 = ascending
        if (sortOrder == "1")
        {
            switch (sortBy)
            {
                case "name":
                    listToBeSorted = listToBeSorted.OrderByDescending(a => a.name).ToList();
                    break;
                case "assigned":
                    listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
                    break;
                case "duedate":
                    listToBeSorted = listToBeSorted.OrderByDescending(a => a.end).ToList();
                    break;
                case "status":
                    listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
                    break;
                default:
                    listToBeSorted = listToBeSorted.OrderByDescending(a => a.title).ToList();
                    break;
            }
        }
        else
        {
            // same code as in if-block, with just OrderBy calls instead of OrderByDescending
        }
        return listToBeSorted;
    }
Run Code Online (Sandbox Code Playgroud)

两个问题:

1) 方法似乎不必要地长(if 和 else 块内的代码非常相似)。

2)我希望能够使用多列进行排序。sortBy 参数可以具有诸如“名称、标题、创建日期、状态”之类的值。因此,应用的排序应该是,首先按名称,然后按标题,然后按创建日期......等等。我可以通过顺序检查参数来使用thenBy 。但是如何根据参数值动态应用一系列ThenBy (s),其中ThenBy的数量可以变化

string[] sortParams = sortBy.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
listToBeSorted.OrderBy(i=>i.sortParams[0]).ThenBy(j=>j.sortParams[1]).ThenBy(k=>k.sortParams[2])...(so on till sortParams.length)
Run Code Online (Sandbox Code Playgroud)

我该怎么做?另外,我还如何使用 sortOrder 参数在同一行中按升序或降序排序,而不是使用 if-else。

smi*_*ech 0

您可以创建Func<string, IComparable>映射到类属性的字典。

public class ItemWithProperty
{
    public string Property { get; set; }
}

public static void Main()
{
    Dictionary<string, Func<ItemWithProperty, IComparable>> stringPropertyMap = new Dictionary<string, Func<ItemWithProperty, IComparable>>()
    {
       {"param1", item => item.Property}
    };

    List<ItemWithProperty> toBeOrdered = new List<ItemWithProperty>();

    string[] parameters = {"param1"};
    var sorted = toBeOrdered.OrderBy(stringPropertyMap[parameters[0]]);
}
Run Code Online (Sandbox Code Playgroud)