所以我有一组对象。对象具有不同的类型,但所有类型都派生自单个基类。我想迭代集合,检查特定派生类型的对象,并在基类中为这些对象调用方法。这就是我所拥有的:
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对于手头的任务有点过分的情况?
答案 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