Условно пропустить дела
В 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
Что я действительно хотел бы сделать вместо этого:
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 When includeEvenNumbers
Console.WriteLine(number)
Case 1, 3, 5, 7, 9 When includeOddNumbers
Console.WriteLine(number)
End Select
Next
End Sub
Обратите внимание, что я использовал When
ключевое слово, которое в настоящее время используется только в Try...Catch
блоки.
Можно ли это сделать? С кем мне поговорить, чтобы это произошло?
РЕДАКТИРОВАТЬ (1/2)
Важно то, что этот код сначала оценит When <expression>
, Только если это оценивает True
было бы оценить Case <expression>
,
Основная причина, по которой я хочу это сделать, заключается в том, что я хотел бы написать случаи, когда условие теста выдает исключение, если обстоятельства правильные (или неправильные, в зависимости от того, как вы на это смотрите). Я хотел бы пропустить эти случаи, если предварительное условие верно.
РЕДАКТИРОВАТЬ (2/2)
К настоящему времени ясно, что то, о чем я прошу, невозможно в текущей итерации VB. Поэтому я искал место для отправки запросов на функциональные возможности группе разработчиков.NET, а затем обнаружил, что у них есть платформа для пользовательских счетов.
Короче говоря: если вы хотите, чтобы это было реализовано, нажмите кнопку голосования на этой странице: https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4274712-add-when-keyword-support-to-select-case-stat
2 ответа
Пример 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
Используя enum вместо 2 booleans, вам нужен только один оператор 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)