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"; }
où ^
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
Désavantages
Améliorations
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;