2016-09-25 40 views
0

是否有一種特殊的語法將僅循環集合中某種類型的元素?對於每個循環和類型鑄造僅適用於與類型匹配的對象

例如:

For Each number As Integer In {0, "string", 4.6, 7, someClassInstance} 
Next 

我想類似的語法上述這將僅通過陣列中的第一和第四元件迴路。

然而,根據the documentation

「元素的數據類型必須使得組中的元素的數據類型可以轉換到它。」

所以我不能用上面的語法做這樣的事情。


我在我的代碼處理實際的例子是:

Public MustInherit Class BaseClass 
End Class 

Public Class SubClass1 : Inherits BaseClass 
    Public x As Integer 
End Class 

Public Class SubClass2 : Inherits BaseClass 
End Class 

主要代碼:

Dim someList As List(Of BaseClass) 

For Each instance In someList 
    'Do something with instance.x 
Next 

所以我需要檢查,如果instanceSubClass1型和每次使用時我都會使用x


前一陣子我問this question Swift。我希望在VB中有類似的答案。

+0

但是,該組表示什麼?通常情況下,您在同構集上執行「For Each」。該數據將不得不被存儲'作爲對象' – Plutonix

+0

@Putonix是的,這是一個對象數組。也許一個更好的例子是在我的代碼中,我有一個MustInherit類的集合,並且只想遍歷特定類的對象。 – Shuri2060

+0

我不知道在VB中,但在C#中它是「是」。 https://msdn.microsoft.com/en-us/library/scekt9xw.aspx – Paparazzi

回答

1

沒有沒有「特殊語法」對於異構合集不是經常路要走在.net

雖然,你可以OfType「過濾」根據一些類型的集合使用:

For Each number In {0, "string", 4.6, 7, someClassInstance}.OfType(Of Integer) 

注:如果選項嚴格設置爲關閉的選項的代碼只能編譯嚴格禁止對隱含對象類型

關於編輯,當你有一個base集合時,通常需要檢查派生類型的代碼味道;這意味着類層次結構中應該有一個mustoverride/overridable方法來處理它。

+0

謝謝 - 使用過濾器對我來說是個好主意。 mustoverride方法是什麼意思? – Shuri2060

+0

@QuestionAsker我的意思是做真正的面向對象的代碼,當你創建一個基礎集合時,你明確指出你想要的是屬於這個層次結構的一些對象的集合,並且不關心你擁有哪一個對象,因爲你只是對他們共同分享的東西感興趣。然後你想知道你有哪一個,與前面的句子完全相反。 – Sehnsucht

+0

...相反,如果基類有一個被繼承者覆蓋的方法(如果需要的話),你真的不關心集合中的哪一個,因爲在你不知道的情況下調用該方法將會「走向正確的一個」。 tl; dr **多態性** – Sehnsucht