c# - 从 List.FindAll 创建新的派生类对象
问题描述
我有一个名为的类Myitem
和一个派生List
类MyItemCollection
...
public class MyItemCollection : List<MyItem> { ... }
public class MyItem { ... }
我想FindAll
用来返回一个MyItemCollection
包含值子集的类的新实例MyItem
......
public MyItemCollection GetInUse()
{
return this.FindAll(x => x.InUse);
}
但是,作为FindAll
回报List<MyItem>
而不是MyItemCollection
上述失败。
是否有可能得到.FindAll
返回一个对象,或者使用 return fromMyItemsCollection
来启动一个对象?MyItemsCollection
.FindAll
我可以执行以下操作,但我想知道是否有更好的解决方案......
public MyItemCollection GetInUse(bool inUse)
{
var col = new MyItemsCollection();
foreach (var item in this.FindAll(x => x.InUse))
col.Add(item);
return col;
}
解决方案
List<T>
有一个带IEnumerable<T>
参数的构造函数。您可以在您的类中公开一个类似的构造函数,然后执行以下操作:
public MyItemCollection GetInUse() => new MyItemCollection(this.Where(i => i.InUse));
或者,不要使用您自己的收藏。如果您只想在列表中添加辅助方法,可以使用扩展方法:
public static IEnumerable<MyItem> GetInUse(this IEnumerable<MyItem> e)
=> e.Where(i => i.InUse);
您还可以通过接口设计您的类以具有这些扩展的帮助器。如果您有多个具有相似功能的不相关类,这将很方便。然后,扩展方法可以使用接口作为 的类型参数IEnumerable
,或者本身是泛型的,具有对类型的泛型约束。
推荐阅读
- javascript - 缺少必需的参数“电子邮件”
- php - 如何在 wordpress 中获得作者第一篇文章的链接
- javascript - Apache Solr 提取,基于查询突出显示 HTML 元素,过滤查询词
- angular - 尝试在 Angular 项目中运行 ng serve 时出现问题'找不到模块“@angular-devkit/build-angular/package.json'”
- gnu - GNU Readline:如何设置输入字符串的初始内容
- r - 使用 fixst/feols() 时如何从模型中恢复常量/截距?
- sql - 为大数据和多用户设计数据库
- python - 我们如何附加或连接具有大部分相似架构但不是全部的多个文件
- case - CTE 结果在 CTE CASE WHEN 中不可见
- python-3.x - 使局部变量成为全局变量