跨多行代码进行多种排序?

时间:2011-08-18 14:40:48

标签: c# linq sorting

我有一个数组存储我要按列表排序的顺序。

SortOrderArray: "Color", "Volume", "Weight"

所以我想按颜色,体积,然后重量

来订购我的清单
MyList.OrderBy(a=>a.Color).ThenBy(a=>a.Volume).ThenBy(a=>a.Weight).ToList();

所以这很不错。现在,我希望能够根据我发送的sortOrder数组编写一个执行此排序的函数:

public List<row> GetSortedList(List<row> list, string[] sortOrder){
    ???
}

我无法弄清楚如何在没有为sortOrders的每个组合编写linq查询的情况下执行此操作(27个不同的查询似乎是实现此目的的最糟糕方式,并且我很可能犯了一个小错误) 。我希望能够编写3个linq查询,根据3种排序方法重新排序列表,如下所示:

switch(sortOrder[0]){
    Sort by the first sort method
}  
switch(sortOrder[1]){
    Sort by the second sort method
}
switch(sortOrder[2]){
    Sort by the third sort method
}

但是,如果我尝试执行上面的代码,它每次都会对它进行调整,而不是在上面的代码之后进行子排序。希望很清楚,任何帮助都会受到赞赏。

5 个答案:

答案 0 :(得分:2)

两件事。您需要一种执行“稳定排序”的排序方法 - 它保持具有相同键的项的现有顺序。然后,您需要按照排序条件的相反顺序调用它,以便主要排序是您执行的最后一次排序。

答案 1 :(得分:0)

我猜你没有使用订单子句的返回值。

public List<row> GetSortedList(List<row> list, string[] sortOrder)
{
    IOrderedEnumerable<row> result = null;

    bool first = true;

    foreach(sortClause in sortOrder)
    {
        switch sortClause
        {
            case "Color":
                if(first)
                    result = list.OrderBy(x => x.Color);
                else
                    result = result.ThenBy(x => x.Color);
                break;
            // the other cases 
        }
        first = false;
    }    

    return result.ToList();
}

类似的东西。

答案 2 :(得分:0)

如果您要排序的可能字段数量有限,则切换可能是最佳解决方案。如果您正在寻找可扩展的内容,则必须generate a lambda expression on the fly,并使用反射来调用适当类型的.OrderBy.ThenBy方法。

答案 3 :(得分:0)

使用Dynamic LINQ,您可以执行以下操作:

public List<row> GetSortedList(List<row> list, string[] sortOrder)
{
    // argument-validation, including testing that 
    // sort-order has at least 1 item.

    return sortOrder.Skip(1)
                    .Aggregate(list.AsQueryable().OrderBy(sortOrder.First()),
                               (query, nextSortTerm) => query.ThenBy(nextSortTerm))
                    .ToList();     
}

基本上:OrderBy第一个排序词,ThenBy剩下的。

编辑:添加AsQueryable调用以使动态LINQ在IEnumerable<T>上运行

答案 4 :(得分:0)