我有一个数组存储我要按列表排序的顺序。
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
}
但是,如果我尝试执行上面的代码,它每次都会对它进行调整,而不是在上面的代码之后进行子排序。希望很清楚,任何帮助都会受到赞赏。
答案 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)