【问题标题】:Pass in Array to Select Case传入数组以选择案例
【发布时间】:2010-12-26 14:32:51
【问题描述】:

这可能是一个密集的问题,我发现它不是 this one 的重复,但我需要一些帮助来了解数组是否可以在 Select Case 语句中使用。

我有一个子例程,我将动态创建一个字符串数组。还列出了 XML,但它可以是下面列出的任何值。它会是这样的:

Dim offensiveLine() As String = New String() {"center", "right wing", "left wing"}
Dim defensiveLine As String = "defense"
Dim playerInfo = <Player><Name>John</Name><Position val="right wing"/></Player>

我想做的是看看这个球员是否在进攻线之一。所以我说:

Dim playerPosition = playerInfo.Position.@val
Select Case playerPosition
Case offensiveLine
'do something
Case defensiveLine
'do something
Case Else 
'do nothing
End Select

这就是问题所在:Case offensiveLine 无效。我知道我可以写出Case "center", "right wing", "left wing",但这会破坏我正在尝试做的事情的目的,即创建一个可以在 Case 语句中读取的数组的广义变量。其次,我知道我不能创建像 Dim offensiveLine = ""center", "right wing", "left wing"" 这样的变量并将其传递进去。

关于如何将数组传递给 Case 语句并评估每个语句的任何见解?

【问题讨论】:

  • 为什么是数组而不是枚举?
  • 好问题,我没想到。你认为 Enum 在这里会做同样的事情吗,即我可以有一个包含 3 个字符串值的枚举,我只需传入 Enum 名称来评估所有三个值?

标签: vb.net linq select-case


【解决方案1】:

您可能需要考虑在此处使用 if 子句而不是 switch。试试这个逻辑:如果进攻线包含playerPosition,那么进攻线,等等。

【讨论】:

  • 感谢诺拉。我可能可以这样做,但要特别注意是否可以将数组传递到开关中。强类型的选项数组可以是 Case 表达式列表的一部分(例如:Case "one"、"two"、"three")。我也有同样的需求,我只需要动态传入而不是强类型。
【解决方案2】:

Select..Case 构造不能这样工作。但是,很容易测试一个元素是否存在于数组中:

If offensiveLine.Contains(playerPosition) Then
    'Do something
ElseIf defensiveLine.Contains(playerPosition) Then
    'Do something else
End If

【讨论】:

    【解决方案3】:

    您实际上可以使用Select 声明:

    Dim playerPosition = playerInfo.Position.@val
    Select Case True
        Case offensiveLine.Contains(playerPosition)
            'do something
        Case defensiveLine.Contains(playerPosition)
            'do something
        Case Else 
            'do something - otherwise you don't need the 'Case Else'
    End Select
    

    诀窍在于Select 的第一行中的True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-07
      • 2021-03-27
      • 2014-02-09
      • 2022-01-20
      • 2011-04-21
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多