求助:如何使用LINQ按CompletionPercentage多数值条件排序列表?
修正后的排序代码及说明
原代码存在的问题
Where语句缺少闭合括号,导致语法错误- 排序逻辑错误:C# 中布尔值排序时
false(对应数值0)会排在true(对应数值1)之前,直接用条件作为排序键会导致不符合条件的项排在前面 - 第一个排序条件错误地使用了
>1 && <99,与需求的>0 && <100不符
修正后的代码
var data = myCollection .Where(x => getCourses.CourseLevel.Contains(x.CourseLevel)) // 补充闭合括号 .OrderBy(x => x.CompletionPercentage switch { > 0 and < 100 => 0, // 优先组,排序值最小 0 => 1, // 次优先级组 100 => 2, // 最后组 _ => 0 // 处理边界情况(如null?根据实际情况调整) }) .ToList(); // ToList() 放在最后更高效,避免提前枚举集合
兼容旧版C#的写法
如果项目不支持C# 8.0及以上的switch表达式,可使用三元运算符实现:
var data = myCollection .Where(x => getCourses.CourseLevel.Contains(x.CourseLevel)) .OrderBy(x => x.CompletionPercentage > 0 && x.CompletionPercentage < 100 ? 0 : x.CompletionPercentage == 0 ? 1 : 2) .ToList();
核心逻辑说明
- 为每个分组分配明确的排序优先级数值:0(最高优先级)、1(次优先级)、2(最低优先级),通过
OrderBy按数值从小到大排序,完全匹配需求的展示顺序 - 将
ToList()移到链式调用的最后,避免提前将集合加载到内存,提升查询性能 - 修复了
Where语句的语法错误,确保过滤逻辑正常执行
内容的提问来源于stack exchange,提问作者CodeLearner
相关产品推荐
相关产品推荐

