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
可以处理此特定任务。第三个块更短,更容易理解,如果使用正确,可能会执行得更好。