如何排序自定义集合MyClassCollection?兼谈继承List<T>的合理性
关于自定义集合继承List及排序问题的解答
一、继承List做自定义集合的说法是否正确?
你提到的“继承ListCollection<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
相关产品推荐
相关产品推荐

