不知道如何在集合上运行Where以返回集合

时间:2011-12-15 21:35:30

标签: c# linq .net-4.0

假设我有一个名为Foo1的MyCollection类的实例。 MyCollection基本上是MyClass的集合。不知道如果有或没有演员,我怎么能做下面这样的事情呢?

MyCollection Foo2 =  Foo1.Where( r => r.LastName == “SomeName”)

注意:MyCollection& MyClass来自第三方库。我可能可以在其上创建扩展方法,但希望有一些简单的方法。

3 个答案:

答案 0 :(得分:3)

您可以实现IEnumerable<MyClass>,并且在实现中只需枚举内部集合。这会自动显示所有LINQ到对象的扩展方法(Enumerable类方法)。

public class MyCollection : IEnumerable<MyClass>

答案 1 :(得分:2)

如果您希望MyCollection的新实例仅包含符合条件的元素,则可以在班级上创建Where方法。

或者,您可以依赖IEnumerable<T>上的linq扩展方法(假设您的类实现IEnumerable<MyClass>),并使用通常用于从序列中填充MyCollection的任何方法MyClass个对象。

修改

linq扩展方法方法示例:

  • 确保MyCollection实施IEnumerable<MyClass>
  • 确保MyCollection具有接受IEnumerable<MyClass>
  • 的构造函数
  • 包括#using System.Linq;
  • 示例声明:MyCollection Foo2 = new MyCollection(Foo1.Where( r => r.LastName == “SomeName”));

编辑编辑

我现在看到MyClass和MyCollection是第三方类型。我从“我的”位开始假设你自己设计它们。

MyCollection类型几乎肯定会实现IEnumerable<MyClass> - 如果不实现,它可能会实现非通用IEnumerable。在这种情况下,您可以使用Cast<T>扩展方法。如果它既没有实现接口,那么第三方库也有些缺乏。

答案 2 :(得分:0)

只要MyCollection实现IEnumerable或IQueryable,Where方法就可以工作,并返回匹配元素的子集。也就是说,具有LastName ==“SomeProperty”的元素。

只要MyCollection实现IEnumerable<MyClass>IQueryable<MyClass>,就不需要强制转换。