Utilisation de .StartsWith dans une instruction Switch?

Je travaille sur une instruction Switch et avec deux des conditions dont j’ai besoin pour voir si les valeurs commencent par une valeur spécifique. L’instruction Switch fait comme ceci. L’erreur indique “ne peut pas dissimuler le type bool to ssortingng”.

Quelqu’un sait si je peux utiliser StartsWith dans un commutateur ou dois-je utiliser les instructions If … Else?

switch(subArea) { case "4100": case "4101": case "4102": case "4200": return "ABC"; case "600A": return "XWZ"; case subArea.StartsWith("3*"): case subArea.StartsWith("03*"): return "123"; default: return "ABCXYZ123"; } 

Vous subArea.StartsWith() Ssortingng et subArea.StartsWith() renvoie un Boolean , c’est pourquoi vous ne pouvez pas le faire. Je vous suggère de le faire comme ceci:

 if (subArea.StartsWith("3*") || subArea.StartsWith("03*")) return "123"; switch(subArea) { case "4100": case "4101": case "4102": case "4200": return "ABC"; case "600A": return "XWZ"; default: return "ABCXYZ123"; } 

Le résultat sera le même.

Les étiquettes de casse doivent être des chaînes, car l’expression du commutateur est une chaîne; cependant, StartsWith renvoie un booléen. Je suggère de traiter ces cas spéciaux dans la section default .

 switch(subArea) { case "4100": case "4101": case "4102": case "4200": return "ABC"; case "600A": return "XWZ"; default: if (subArea.StartsWith("3") || subArea.StartsWith("03")) { return "123"; } return "ABCXYZ123"; } 

De plus, l’écanvas (*) est probablement fausse, à moins que vous ne subArea que la sous- subArea contienne. StartWith n’accepte pas les caractères génériques.

Sinon, vous pouvez utiliser regex:

 if (Regex.IsMatch(subArea, "^3|^03")) { // or "^(3|03)" return "123"; } 

^ signifie début de ligne et | signifie ou .

Juste pour le plaisir, voici une autre solution qui évite l’instruction switch.

 var map = new[] { new { Value = "4100", StartsWith = false, Result="ABC" }, new { Value = "4101", StartsWith = false, Result="ABC" }, new { Value = "4102", StartsWith = false, Result="ABC" }, new { Value = "4200", StartsWith = false, Result="ABC" }, new { Value = "600A", StartsWith = false, Result="XWZ" }, new { Value = "3*", StartsWith = true, Result="123" }, new { Value = "03*", StartsWith = true, Result="123" }, }; var subarea = ... whatever ...; var result = map.Where(e => { if (e.StartsWith) { return subarea.StartsWith(e.Value); } else { return subarea == e.Value; } } ) .Select(e => e.Result) .FirstOrDefault() ?? "ABCXZ123"; 

L’ordre dans la masortingce de tableaux détermine la priorité, de sorte que, par exemple, vous pouvez avoir une correspondance exacte, par exemple “3 * 11”, ainsi qu’une correspondance StartsWith sur “3 *”, par exemple:

 var map = new[] { new { Value = "3*11", StartsWith = false, Result="ABC" }, new { Value = "4100", StartsWith = false, Result="ABC" }, new { Value = "4101", StartsWith = false, Result="ABC" }, new { Value = "4102", StartsWith = false, Result="ABC" }, new { Value = "4200", StartsWith = false, Result="ABC" }, new { Value = "600A", StartsWith = false, Result="XWZ" }, new { Value = "3*", StartsWith = true, Result="123" }, new { Value = "03*", StartsWith = true, Result="123" }, }; 

Joe m’a un peu battu, mais voici une autre façon de le faire, qui implémente essentiellement un algorithme de correspondance de modèle avec un ensemble de règles.

 private static ssortingng GetSomeSsortingngOrOther(ssortingng subArea) { // Create a set of pattern matching functions... Func matchEquals = (a, b) => a.Equals(b); Func matchStarts = (a, b) => a.StartsWith(b); // Create a rule set... Tuple>[] cases = new [] { new Tuple>("4100", "ABC", matchEquals), new Tuple>("4101", "ABC", matchEquals), new Tuple>("4102", "ABC", matchEquals), new Tuple>("4200", "ABC", matchEquals), new Tuple>("600A", "XWZ", matchEquals), new Tuple>("3*", "123", matchStarts), new Tuple>("03*", "123", matchStarts), }; // Look for a match... foreach(var matchCase in cases) { if(matchCase.Item3(subArea, matchCase.Item1)) { // Return if it matches... return matchCase.Item2; } } // Otherwise return the default... return "ABCXYZ123"; } 

Les avantages

  • Si vous avez besoin d’une nouvelle règle, il est facile de l’append à l’ensemble de règles.
  • Si vous avez besoin d’une nouvelle fonction de correspondance de motif, encore une fois, facile à append.
  • N’a pas besoin de nombreuses retouches si une règle change

Désavantages

  • Novice / Débutant et même certains développeurs intermédiaires pourraient ne pas avoir la moindre idée de ce qui se passe.

Améliorations

  • Remplacez Tuple> par un object sémantique représentant une Rule

Avec LINQ, la réponse intéressante de @seriesOne peut être un peu “simplifiée” en remplaçant les instructions foreach et return par:

 // using System.Linq; // Look for a match... var result = cases .Where(c => c.Item3(subArea, c.Item1)) .FirstOrDefault(); // Return the match or the default. return result == null ? "ABCXYZ123" : result.Item2;