Unity中如何使用Sort()方法按字段对自定义类List排序
实现方案
针对存储自定义类型的List排序,你只需要在调用Sort()时传入两个元素的比较规则即可,以下是三种常用实现,按需选择:
方法1:Lambda表达式快速实现(推荐,代码最简洁)
直接在需要触发排序的位置传入比较逻辑,不需要额外定义类:
如果希望每次新增记录后列表自动保持有序,可以直接把排序逻辑加到// 按recordDate字段升序排序(数值小的在前,适合按日期从早到晚排列) historyRecords.Sort((recordA, recordB) => recordA.recordDate.CompareTo(recordB.recordDate)); // 若需要降序排序(数值大的在前,最新记录排最前),颠倒比较对象即可 // historyRecords.Sort((recordA, recordB) => recordB.recordDate.CompareTo(recordA.recordDate));AddToHistory方法末尾:public void AddToHistory(int ID, string description) { HistoryRecordList newRecord = new HistoryRecordList(); newRecord.recordDate = ID; newRecord.record = description; historyRecords.Add(newRecord); // 新增后自动完成排序 historyRecords.Sort((a, b) => a.recordDate.CompareTo(b.recordDate)); }方法2:定义独立比较器(适合排序逻辑需要多处复用的场景)
单独实现IComparer<T>接口编写比较规则,多处调用时不需要重复写逻辑:
调用时传入比较器实例即可:using System.Collections.Generic; public class HistoryRecordDateAscComparer : IComparer<HistoryRecordList> { public int Compare(HistoryRecordList x, HistoryRecordList y) { // 处理空引用情况,避免报错 if (x == null) return y == null ? 0 : -1; if (y == null) return 1; return x.recordDate.CompareTo(y.recordDate); } }historyRecords.Sort(new HistoryRecordDateAscComparer());方法3:让自定义类自带排序规则(适合该类型固定按某字段排序的场景)
直接让HistoryRecordList实现IComparable<T>接口,之后调用无参的Sort()就会自动按预设规则排序:
调用方式最简洁:using System; [System.Serializable] public class HistoryRecordList : IComparable<HistoryRecordList> { public int recordDate; public string record; public int CompareTo(HistoryRecordList other) { if (other == null) return 1; return recordDate.CompareTo(other.recordDate); } }historyRecords.Sort();
注意:不要使用
return a.recordDate - b.recordDate的写法实现比较,当两个整数值差距超过int取值范围时会出现溢出,导致排序结果完全错误,使用内置的CompareTo方法是最稳妥的实现。
内容的提问来源于stack exchange,提问作者Raoul L'artiste
相关产品推荐
相关产品推荐

