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
相关产品推荐
相关产品推荐

