== Why is this an issue?

When https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement[Select Case] statements have large sets of case clauses, it is usually an attempt to map two sets of data. A https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2[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 https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2.trygetvalue[TryGetValue] method.

=== Code examples

==== Noncompliant code example

[source,vbnet,diff-id=1,diff-type=noncompliant]
----
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

[source,vbnet,diff-id=1,diff-type=compliant]
----
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
----

include::../resources-dotnet.adoc[]
* https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/select-case-statement[Select...Case Statement]


include::../rspecator-dotnet.adoc[]
