You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何按自定义顺序对含ID和NAME的Details泛型列表排序

问题原因

你的代码存在两个问题:

  1. C# 中单引号仅用于声明char类型,字符串比较需要使用双引号,原有代码如果直接运行会先触发编译错误。
  2. 排序逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:06:04