【问题标题】:For Each loop and type casting only for objects which match typeFor Each 循环和类型转换仅适用于匹配类型的对象
【发布时间】:2016-09-25 22:38:03
【问题描述】:

是否有一种特殊的语法可以只遍历集合中某种类型的元素?

例如:

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

我想要一个与上面类似的语法,它只会循环遍历数组中的第一个和第四个元素。

但是,根据the documentation

"元素的数据类型必须是group的元素的数据类型可以转换成它。"

所以我不能使用上面的语法来做这样的事情。


我在代码中处理的实际示例是:

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 询问了 Swift。我希望在 VB 中得到类似的答案。

【问题讨论】:

  • 但是那个组代表什么?通常你在同构集上做For Each。该数据必须存储As Object
  • @Plutonix 是的,这是一个对象数组。也许更好的例子是在我的代码中,我有一个 MustInherit 类的集合,并且只想遍历特定类的对象。
  • 我不知道在 VB 中,但在 C# 中它是“是”。 msdn.microsoft.com/en-us/library/scekt9xw.aspx

标签: vb.net collections foreach casting


【解决方案1】:

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

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

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

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

关于编辑,当你有一个 base 集合时,必须检查派生类型通常是一种代码味道;这意味着在类层次结构中应该有一个必须覆盖/可覆盖的方法来处理它。

【讨论】:

  • 谢谢 - 使用过滤器对我来说是个好主意。 mustoverride 方法是什么意思?
  • @QuestionAsker 我的意思是做真正的面向对象的代码,当你创建一个基础集合时,你明确指出你想要的是属于该层次结构的一些对象的集合,而不关心哪个对象你有,因为你只对他们共同分享的东西感兴趣。然后你想知道你有哪一个,与上一句完全矛盾。
  • ... 相反,如果基类有一个方法被它的继承者覆盖(如果需要),那么您真的不在乎集合中的哪一个,因为调用该方法将“向右移动”一个”,你甚至都不知道。 tl;dr 多态性
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多