如何让List.FindAll返回MyItemCollection实例或用其结果初始化该类?
解决方法:利用构造函数简化转换
这个问题其实很好解决,核心是复用List<T>本身的构造逻辑,给你的MyItemCollection添加一个接受IEnumerable<MyItem>的构造函数就行,比你现在逐个添加的方案更简洁高效。
步骤1:修改MyItemCollection类
给你的集合类新增一个带参数的构造函数,直接复用基类List<T>处理IEnumerable<T>的逻辑,同时保留无参构造函数避免破坏现有代码:
public class MyItemCollection : List<MyItem> { // 新增构造函数:用IEnumerable<MyItem>初始化集合 public MyItemCollection(IEnumerable<MyItem> items) : base(items) { } // 保留无参构造函数,兼容原有使用场景 public MyItemCollection() { } // 你原来的其他成员逻辑... }
步骤2:简化GetInUse方法
现在你可以直接用FindAll的返回值初始化MyItemCollection,一行代码搞定:
public MyItemCollection GetInUse() { return new MyItemCollection(this.FindAll(x => x.InUse)); }
甚至可以用LINQ的Where替代FindAll,效果完全一致:
public MyItemCollection GetInUse() { return new MyItemCollection(this.Where(x => x.InUse)); }
为什么这个方案更优?
- 效率更高:
List<T>的IEnumerable<T>构造函数会先计算元素总数,预分配合适的容量,避免逐个Add时多次触发数组扩容的开销。 - 代码更简洁:省去了手动循环添加的冗余逻辑,可读性更强。
备选方案(不修改构造函数时)
如果暂时不想修改MyItemCollection的构造函数,也可以用AddRange方法替代逐个添加,比循环更高效:
public MyItemCollection GetInUse() { var result = new MyItemCollection(); result.AddRange(this.FindAll(x => x.InUse)); return result; }
不过还是推荐第一种构造函数的方案,是最优雅的解决方式。
内容的提问来源于stack exchange,提问作者freefaller
相关产品推荐
相关产品推荐

