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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:23:14