使用Linq分组如何按特定组排序,然后剩余组降序

时间:2014-06-27 16:18:27

标签: c# linq sorting grouping

此代码是精选案例陈述内容的工作示例。响应链接按钮,通过Session变量传入谁的ID。链接按钮代表高(3)中(2)和低(1)风险类别。

这里的逻辑是;如果选择Medium(2),则首先显示相关的行(riskCategory = 2),然后列出剩余的行(风险类别),然后是3,然后是2,然后是0)

正如我所说,为了实现我的目标而实现我的目标的丑陋实现确实产生了正确的结果,但它也表明我需要花费更多的周末来审查和创建比简单的101链接样本教程项目提供的更复杂的样本。< / p>

必须有一种更优雅的方式进行分组和排序,同时允许首先按顺序排列代表所选组的组,其余组下降。再次选择Group 1 LowRiskCategory,我将首先显示LowRiskCategory(1)然后显示3,2和&amp;分别在排序结果集中分别为0。

var midQuery = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(intRiskCategoryEnum));                                    
midQuery.OrderByDescending(v => v["DateOfService"]);
midQuery.OrderBy(v => v["Reviewed"]);

var midQueryZero = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(0));
midQueryZero.OrderByDescending(v => v["DateOfService"]);
midQueryZero.OrderBy(v => v["Reviewed"]);

var midQueryOne = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(1));
midQueryOne.OrderByDescending(v => v["DateOfService"]);
midQueryOne.OrderBy(v => v["Reviewed"]);

var midQueryThree = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(3));
midQueryThree.OrderByDescending(v => v["DateOfService"]);
midQueryThree.OrderBy(v => v["Reviewed"]);

var querySummation = midQuery.Concat(midQueryThree);
querySummation = querySummation.Concat(midQueryOne);
querySummation = querySummation.Concat(midQueryZero);
dtQueryResults = querySummation.CopyToDataTable()

在案例2的翻译枚举值之后看到那些硬编码的数字值: 让我wana投掷。 Theres必须是更优雅的方式来做这些团体。由特定组别订购。当然,应用我所有其他奇怪的排序,如您所看到的服务日期并进行审核。

最后,如果你要再次投票 至少解释为什么请谢谢

2 个答案:

答案 0 :(得分:1)

var dtQueryResults = yourData
            .OrderByDescending(v => v["RiskCategory"] == intRiskCategoryEnum)//true for ==2 goes first, false goes then
            .ThenBy(v => v["RiskCategory"]) //the rest is sorted normally
            .ThenBy(v => v["Reviewed"]) //inside the groups, the rest of your sorts is used
            .ThenByDescending(v => v["DateOfService"]);

答案 1 :(得分:0)

只需更改您用于OrderBy的lambda即可。你不仅仅局限于一个领域。我将使用三级表达式根据所选内容选择要排序的内容。