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

如何排序自定义集合MyClassCollection?兼谈继承List<T>的合理性

关于自定义集合继承List及排序问题的解答

一、继承List做自定义集合的说法是否正确?

你提到的“继承List来添加自定义方法”是完全可行的,但有个关键细节要注意:List的核心方法比如Add、Remove都是非虚方法,你没法直接重写它们。如果你的需求只是扩展一些专属方法(比如批量导入、特定条件查询),那继承List是个简单高效的选择;但如果想要重写Add/Remove这类行为来实现自定义逻辑(比如添加时校验数据格式),更推荐继承Collection<T>(它专门设计了可重写的虚方法,比如InsertItem、SetItem),或者直接实现IList<T>接口。

简单总结:你的说法部分正确——添加自定义方法完全没问题,但重写Add()这类方法的话,List做不到,得换更合适的基类。

二、MyClassCollection排序的解决方法

因为OrderBy()返回的是IEnumerable<MyClass>,ToList()只能生成List<MyClass>,没法直接转成你的自定义集合类型,这里有几个实用的解决思路:

方法1:给自定义集合添加带IEnumerable参数的构造函数

修改你的MyClassCollection,添加一个接收集合的构造函数,复用List的基类构造逻辑:

class MyClassCollection : List<MyClass>
{
    // 默认构造函数
    public MyClassCollection() : base() { }
    // 接收IEnumerable的构造函数
    public MyClassCollection(IEnumerable<MyClass> collection) : base(collection) { }
}

这样排序后就能直接用这个构造函数生成新的MyClassCollection实例:

myClassCollection = new MyClassCollection(myClassCollection.OrderBy(x => x.name));

方法2:在自定义集合内添加专属排序方法

如果不想创建新的集合实例,而是直接修改原集合的顺序,可以在MyClassCollection里加一个自定义排序方法:

class MyClassCollection : List<MyClass>
{
    public void SortByName()
    {
        // 使用List<T>自带的Sort方法,传入自定义比较器
        this.Sort((item1, item2) => string.Compare(item1.name, item2.name, StringComparison.OrdinalIgnoreCase));
        // 若需要区分大小写,去掉OrdinalIgnoreCase即可
    }
}

使用时直接调用方法,不用重新赋值:

myClassCollection.SortByName();

方法3:写一个扩展方法转换类型

如果不想修改MyClassCollection的代码,可以写一个扩展方法来把IEnumerable转成你的自定义集合:

public static class MyClassCollectionExtensions
{
    public static MyClassCollection ToMyClassCollection(this IEnumerable<MyClass> source)
    {
        return new MyClassCollection(source);
    }
}

然后排序后直接调用这个扩展方法:

myClassCollection = myClassCollection.OrderBy(x => x.name).ToMyClassCollection();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:10:49