从 List.FindAll 创建新的派生-class 对象

Create new derived-class object from List.FindAll

我有一个名为 Myitem 的 class 和一个派生的 List class MyItemCollection...

public class MyItemCollection : List<MyItem> { ... }
public class MyItem { ... }

我想将 FindAll 用于 return MyItemCollection class 的新实例,其中包含 MyItem 值的子集。 .

public MyItemCollection GetInUse()
{
  return this.FindAll(x => x.InUse);
}

然而,由于 FindAll returns List<MyItem> 而不是 MyItemCollection,上述失败。

是否有可能获得 .FindAll 到 return 一个 MyItemsCollection 对象,或者使用 [=43 初始化一个 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> 参数的构造函数。您可以在 class 中公开类似的构造函数,然后执行如下操作:

public MyItemCollection GetInUse() => new MyItemCollection(this.Where(i => i.InUse));

或者,不要使用您自己的 collection。如果你只想在列表上添加辅助方法,你可以使用扩展方法:

public static IEnumerable<MyItem> GetInUse(this IEnumerable<MyItem> e) 
  => e.Where(i => i.InUse);

您还可以将 classes 设计为通过接口使用这些扩展助手。如果您有多个不相关的 class 具有相似功能,这会很方便。然后扩展方法可以使用接口作为 IEnumerable 的类型参数,或者本身是通用的,对类型具有通用约束。