从 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
的类型参数,或者本身是通用的,对类型具有通用约束。
我有一个名为 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
的类型参数,或者本身是通用的,对类型具有通用约束。