2014-10-12 74 views
-1

所以我有一个对象集合。对象是不同类型的,但所有类型都来自单个基类。我想遍历集合,检查特定派生类型的对象,并为这些对象调用基类中的方法。这是我有:调用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对于手头任务过度使用的一个例子吗?

回答

3

您可以使用OfType

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

这是比我一直在寻找更好的。非常感谢你!我会尽快接受S/O让我。 :) – DWRoelands 2014-10-12 13:59:35

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 
相关问题