首页 > 解决方案 > 从 List.FindAll 创建新的派生类对象

问题描述

我有一个名为的类Myitem和一个派生ListMyItemCollection...

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;
}

标签: c#lambdageneric-list

解决方案


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,或者本身是泛型的,具有对类型的泛型约束。


推荐阅读