Vb.net 有条件地跳过案例

Vb.net 有条件地跳过案例,vb.net,select-case,Vb.net,Select Case,在Select…Case语句中,是否有基于先决条件跳过案例的方法 我现在正在做的是,用一个极其愚蠢的例子: Private Sub PrintNumbers(includeEvenNumbers As Boolean, includeOddNumbers As Boolean) For number As Integer = 0 To 9 Select Case number Case 0, 2, 4, 6, 8 I

Select…Case
语句中,是否有基于先决条件跳过案例的方法

我现在正在做的是,用一个极其愚蠢的例子:

Private Sub PrintNumbers(includeEvenNumbers As Boolean, includeOddNumbers As Boolean)
    For number As Integer = 0 To 9
        Select Case number
            Case 0, 2, 4, 6, 8
                If includeEvenNumbers Then
                    Console.WriteLine(number)
                End If
            Case 1, 3, 5, 7, 9
                If includeOddNumbers Then
                    Console.WriteLine(number)
                End If
        End Select
    Next
End Sub
有时,我甚至会把我的案例写出来:

Private Sub PrintNumbers(includeEvenNumbers As Boolean, includeOddNumbers As Boolean)
    For number As Integer = 0 To 9
        Select Case True
            Case includeEvenNumbers
                If number Mod 2 = 0 Then
                    Console.WriteLine(number)
                End If
            Case includeOddNumbers
                If number Mod 2 <> 0 Then
                    Console.WriteLine(number)
                End If
        End Select
    Next
End Sub
请注意,我使用了
When
关键字,该关键字目前仅在
Try…Catch
块中使用

这能做到吗?我该找谁来实现这一点

编辑(1/2)

重要的是,此代码将在时首先计算
。只有当其计算结果为
True
,它才会继续计算
案例

我之所以想这样做,主要是因为我想写一些案例,在这些案例中,如果环境是对的(或者是错的,取决于您如何看待),测试条件会抛出异常。如果前提条件为真,我想跳过这些案例

编辑(2/2)

现在很清楚,我所要求的在当前的VB迭代中是不可能的。所以我找了一个地方向.NET开发团队提交功能请求,然后发现他们有一个uservoice平台

长话短说:如果您希望看到此功能的实现,请点击此页面上的投票按钮:

linq示例:

    Dim condition As Predicate(Of Integer) = Nothing
    If includeEvenNumbers Then
        condition = Function(x) x Mod 2 = 0
    Else
        condition = Function(x) x Mod 2 = 1
    End If

    For Each item In Enumerable.Range(0, 8).Where(condition)
        ' do what ever you like here...
    Next
编辑:使其更简单:

For Each item In Enumerable.Range(0, 8).Where(Function(x) x Mod 2 = If(includeEvenNumbers, 0, 1))
    ' do what ever you like here...
Next

通过使用枚举而不是2个布尔值,您只需要一个if语句即可完成2个条件检查。大概是这样的:

Public Enum Include
    Odd = 1
    Even = 2
    Both = 0
End Enum
Private Sub PrintNumbers(includenumbers As Include)
    For I = 1 To 10
        If includenumbers = Include.Both OrElse I Mod 2 = includenumbers Mod 2 Then
            TextBox2.AppendText(I.ToString)
        End If
    Next
End Sub
PrintNumbers(Include.Odd)
你可以这样称呼它:

Public Enum Include
    Odd = 1
    Even = 2
    Both = 0
End Enum
Private Sub PrintNumbers(includenumbers As Include)
    For I = 1 To 10
        If includenumbers = Include.Both OrElse I Mod 2 = includenumbers Mod 2 Then
            TextBox2.AppendText(I.ToString)
        End If
    Next
End Sub
PrintNumbers(Include.Odd)

可能我没有准确地理解您的观点-为什么不使用linq而不是Select Case语句?另一个选项是简单地跳过
Select
,执行类似
的操作,如果includeEventNumber和Also number Mod 2=0,则执行Console.WriteLine(number)或如果includeAddNumber和Also number Mod 2 0,则执行Console.WriteLine(number)如果
,结束?@Rex你会如何将linq融入其中?@Tim这正是我在真实代码中所做的。不是上面愚蠢的例子。我只是不喜欢3+
ElseIf
s出现在你本来可以使用开关的地方,但我不能。我可以看到linq如何用更少的代码解决这个特定问题,但如果问题发生变化,我可以重新开始。是的,如果你有很多条件,它可能会变得非常复杂。但是如果你有很多条件做不同的事情,为什么不把每个任务用不同的标准包装在不同的类中呢?通常,您将有一个具有指定条件的任务集合,然后在整个任务中将数据集合作为上下文传递。。。相信它会更易于维护,不是吗?很好,尽管这不能解释用户想要打印偶数和奇数的情况。但无论如何,我并不想把重点放在解决我给出的例子上。我写这篇文章只是为了说明我要做什么。我添加了代码来实现这两个目的。我的回答应该更详细些。虽然这确实解决了您的示例,但它也证明了当某个构造无法完成您想要的工作时,可能是时候退一步重新检查您的方法了。这种特殊的方法适用于很多需要满足几个不同条件的情况。我完全同意,但这不是我想说的重点。我已经在前两个代码块中证明了
Select…Case
可以处理此特定任务。第三个块更短,更容易理解,如果使用正确,可能会执行得更好。