在LINQ中调用某种类型的所有项目的方法

时间:2014-10-12 13:51:21

标签: vb.net linq

所以我有一组对象。对象具有不同的类型,但所有类型都派生自单个基类。我想迭代集合,检查特定派生类型的对象,并在基类中为这些对象调用方法。这就是我所拥有的:

dim DogQuery = From Dog as DogBase in DogCollection
               Where Dog.GetType = GetType(DogBeagle)
               Select Dog

For Each d as DogBase in DogQuery
    d.Feed()
Next

......但似乎不够优雅。特别是当...

For Each Dog as DogBase in DogCollection
    If Dog.GetType = GetType(DogBeagle) then
        Dog.Feed()
    End If
Next

...在(主观上)更严格的代码中完成同样的事情。

我对立即执行的阅读表明,做我想要的唯一方法是让LINQ返回一个单例或调用类似.ToList()的东西。有没有办法立即执行而无需额外的步骤?或者这仅仅是LINQ对于手头的任务有点过分的情况?

2 个答案:

答案 0 :(得分:3)

您可以使用OfType

For Each beagle As DogBeagle In DogCollection.OfType(Of Beagle)
    beagle.Feed()
End For

答案 1 :(得分:3)

延迟/立即执行与此无关。如果您致电ToList(),则不会改变任何内容。

有两种方法可以使这更简单。

首先,如果您不需要它是完全 Dog类型,但DogBeagle或任何派生自DogBeagle的内容,您可以使用OfType

For Each d As DogBeagle in DogCollection.OfType(Of DogBeagle)()
    d.Feed()
Next

如果你真的想要确切的类型,你可以使用你只是真正使用Where子句的事实 - 你没有改变结果。因此,LINQ不是一种矫枉过正,但查询表达式是......你可以直接使用Where

For Each d As Dog in DogCollection.Where(Function(x) x.GetType() = GetType(DogBeagle))
    d.Feed()
Next
相关问题