For Each循环和类型仅用于匹配类型的对象

时间:2016-09-25 14:15:02

标签: vb.net collections foreach casting

是否有一种特殊的语法只能循环集合中某种类型的元素?

例如:

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

因此,我需要检查instance是否为SubClass1类型,并在每次使用x时投放。

前一段时间我问过this question斯威夫特。我希望在VB中有类似的答案。

1 个答案:

答案 0 :(得分:1)

没有没有“特殊语法”,因为异构集合通常不是的方式 .Net

但是,您可以使用OfType根据某种类型“过滤”该集合:

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

注意:只有当Option Strict设置为Off时才能编译代码,因为Option Strict On禁止隐式对象类型

关于编辑,当你有一个基础集合时,通常需要检查派生类型的代码气味;意味着类层次结构中应该有一个mustoverride / overridable方法来处理它。