Условно пропустить дела

В 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)
Другие вопросы по тегам