Why is this an issue?

When Select Case statements have large sets of case clauses, it is usually an attempt to map two sets of data. A Dictionary should be used instead to make the code more readable and maintainable.

Exceptions

This rule ignores Select Case statements over Enum arguments and empty, fall-through cases.

How to fix it

Store all the cases apart from the Case Else one in a dictionary and try to get the matching value by calling the TryGetValue method.

Code examples

Noncompliant code example

Public Class TooManyCase

    Public Function MapValues(Ch As Char) As Integer
        Select Case Ch ' Noncompliant: 5 cases, "Case Else" excluded, more than maximum = 4
            Case "a"c
                Return 1
            Case "b"c, "c"c
                Return 2
            Case "d"c
                Return 3
            Case "e"c
                Return 4
            Case "f"c, "g"c, "h"c
                Return 5
            Case Else
                Return 6
        End Select
    End Function

End Class

Compliant solution

Public Class TooManyCase

    Private fMatching As New Dictionary(Of Char, Integer) From {
            { "a"c, 1 },
            { "b"c, 2 },
            { "c"c, 2 },
            { "d"c, 3 },
            { "e"c, 4 },
            { "f"c, 5 },
            { "g"c, 5 },
            { "h"c, 5 },
        }

    Public Function MapValues(Ch As Char) As Integer
        Dim Value As Integer
        If fMatching.TryGetValue(Ch, Value) Then
            Return Value
        Else
            Return 6
        End If
    End Function

End Class

Resources

Documentation