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

如何优雅解决List<T>转换为其派生类ListOfT的问题

如何从List派生类中优雅返回自定义子类实例?

我从List<T>派生出ListOfT类,用来存放操作T类型列表的方法。我写了一个用Linq遍历列表并返回T类型子列表的GenerateSubList方法:

public class ListOfT : List<T> 
{
  //无显式构造函数
  //其他操作该T类型列表的方法...

  public ListOfT GenerateSubList()
  {
    return this.Where(t => t.SomeCriteria).ToList(); // <- 编译器报错

    return (ListOfT) this.Where(t => t.SomeCriteria).ToList(); // <- 编译通过但运行时出错
  }
}

编译器提示无法将List<T>转换为ListOfT,显然ToList()会生成新的List<T>实例,但我希望得到ListOfT实例。尝试显式转换虽能通过编译,但会引发运行时错误。请问是否有优雅的方式实现该转换(或替换ToList()调用)?


解决方案(参考@SomeBody的回答)

感谢各位的评论与解决方案,现将总结如下:

public class ListOfT : List<T> 
{
  //公共构造函数
  public ListOfT() {}

  //从可枚举对象创建ListOfT的私有构造函数
  private ListOfT(IEnumerable<T> subList) 
            : base(subList) { }
  
  public ListOfT GenerateSubList()
  {
    //使用Linq创建枚举器并传入私有构造函数
    return new ListOfT(this.Where(t => t.SomeCriteria));
  }
}

补充说明

  • 或许我应该用SomeClass代替T来明确ListOfT是使用SomeClass作为T的List<T>具体实例,而非模板类本身。
  • 针对@Tim Schmelter的疑问:t.SomeCriteria用于表示列表中每个T实例都有一个需验证的属性,符合条件才会被纳入子列表。关于“为何不从List继承”的讨论我已阅读,“拥有”与“是”的区别取决于个人选择和使用场景。
  • 针对@Rookie的疑问:GenerateSubList()返回的新列表不会包含原元素的副本,而是指向调用该方法的ListOfT实例中原始T对象的引用,这是预期行为。
  • 针对@Oren Tamam和@Fildor的建议:我没有选择“拥有”而非“是”的实现方式,因为这需要实现IList<T>接口。我个人认为继承List<T>的方式便于将特定类型列表的操作方法集中管理。
  • 针对@Ralf的建议:扩展方法是增强特定类型列表的另一种方式,我曾在存在类层级且每个派生类都需被“列表化”的场景中使用过,这种情况下,包含扩展方法的静态类便于集中管理各类列表相关方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:12