2014-10-12 65 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 
相關問題