== Why is this an issue? When https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements#the-switch-statement[switch] 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 `switch` statements over `Enum` arguments and empty, fall-through cases. == How to fix it Store all the cases apart from the `default` 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 The example below are using the "Maximum number of case" property set to `4`. ==== Noncompliant code example [source,csharp,diff-id=1,diff-type=noncompliant] ---- public class TooManyCase { public int mapValues(char ch) { switch(ch) { // Noncompliant: 5 cases, "default" excluded, more than maximum = 4 case 'a': return 1; case 'b': case 'c': return 2; case 'd': return 3; case 'e': return 4; case 'f': case 'g': case 'h': return 5; default: return 6; } } } ---- ==== Compliant solution [source,csharp,diff-id=1,diff-type=compliant] ---- using System.Collections.Generic; public class TooManyCase { Dictionary matching = new Dictionary() { { 'a', 1 }, { 'b', 2 }, { 'c', 2 }, { 'd', 3 }, { 'e', 4 }, { 'f', 5 }, { 'g', 5 }, { 'h', 5 } }; public int mapValues(char ch) { int value; if (this.matching.TryGetValue(ch, out value)) { return value; } else { return 6; } } } ---- include::../resources-dotnet.adoc[] * https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/statements/selection-statements#the-switch-statement[The `switch` statement] include::../rspecator-dotnet.adoc[]