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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:42:21