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

Unity按对象属性排序列表时如何处理WeaponData空值

如何正确排序含空WeaponData的Item列表并将空值项置于末尾?

我有一个包含Item对象的列表,每个Item的WeaponData属性可能为空(当物品为装备而非武器时)。需求是依据WeaponData.Type对列表排序,同时将WeaponData为空的项排在列表末尾。

我尝试了以下代码:

items.Sort((p1,p2)=>{
    if(p2.WeaponData == null) return -1;
    else if(p1.WeaponData == null) return 1;
    return p2.WeaponData.Type.CompareTo(p1.WeaponData.Type);
});

但运行时抛出了如下错误:

ArgumentException: Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results.


问题原因

原比较逻辑存在一致性缺陷:当两个Item的WeaponData都为空时,比较p1和p2会返回-1,反过来比较p2和p1又会返回-1,这违反了排序比较器的核心规则——Compare(a,b)与Compare(b,a)的结果必须互为相反数(当a≠b时),或均为0(当a=b时)。

正确实现代码

按WeaponData.Type降序排序(保留原需求的排序方向)

items.Sort((p1, p2) =>
{
    // 两者都为空时视为相等,返回0
    if (p1.WeaponData == null && p2.WeaponData == null)
        return 0;
    // p1为空则排在后面,返回1
    if (p1.WeaponData == null)
        return 1;
    // p2为空则排在后面,返回-1(p1优先排在前面)
    if (p2.WeaponData == null)
        return -1;
    // 非空项按Type降序比较
    return p2.WeaponData.Type.CompareTo(p1.WeaponData.Type);
});

按WeaponData.Type升序排序(若需要升序逻辑)

items.Sort((p1, p2) =>
{
    if (p1.WeaponData == null && p2.WeaponData == null)
        return 0;
    if (p1.WeaponData == null)
        return 1;
    if (p2.WeaponData == null)
        return -1;
    // 非空项按Type升序比较
    return p1.WeaponData.Type.CompareTo(p2.WeaponData.Type);
});

逻辑说明

  • 优先处理双空值场景,确保空值项之间比较结果一致
  • 单独判断单空值场景,明确空值项固定排在末尾的优先级
  • 非空值项按WeaponData.Type执行正常的升序/降序比较

内容的提问来源于stack exchange,提问作者user3754283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:48:20