C#如何按自定义顺序对含ID和NAME的Details泛型列表排序
问题原因
你的代码存在两个问题:
- C# 中单引号仅用于声明
char类型,字符串比较需要使用双引号,原有代码如果直接运行会先触发编译错误。 - 排序逻辑错误:
OrderBy默认是升序排序,布尔值的排序规则是false(对应数值0)在前,true(对应数值1)在后。你写a => a.Name == "Apple"的时候,所有Name等于Apple的项返回true,反而会被排到非Apple的项后面,完全不符合预期顺序。同时你也漏掉了同Name下按ID升序的排序逻辑。
正确实现方案
方案1:优先级映射(可读性和扩展性更好,推荐)
给不同Name值指定排序优先级,先按优先级升序,同优先级再按ID升序,代码如下:
var sortedList = Details .OrderBy(item => item.Name switch { "Apple" => 1, "Orange" => 2, "Kiwi" => 3, _ => 4 // 自动覆盖null和其他未定义的Name值 }) .ThenBy(item => item.ID) .ToList();
如果你的运行环境版本低于C# 8,不支持switch表达式,可以换成字典映射写法:
var sortRule = new Dictionary<string, int> { ["Apple"] = 1, ["Orange"] = 2, ["Kiwi"] = 3 }; var sortedList = Details .OrderBy(item => sortRule.TryGetValue(item.Name, out int order) ? order : 4) .ThenBy(item => item.ID) .ToList();
方案2:调整原有布尔排序的顺序
如果你要沿用原来的判断写法,把OrderBy改成OrderByDescending即可,让匹配到目标Name的true值排在前面:
var sortedList = Details .OrderByDescending(a => a.Name == "Apple") .ThenByDescending(x => x.Name == "Orange") .ThenByDescending(y => y.Name == "Kiwi") .ThenBy(item => item.ID) .ToList();
内容的提问来源于stack exchange,提问作者KillMonger
相关产品推荐
相关产品推荐

