Mit .StartsWith in einer Switch-Anweisung?
Arbeite ich an einer Switch-Anweisung und mit zwei der Voraussetzungen brauche ich, um zu sehen, ob die Werte beginnen mit einem bestimmten Wert. Die Switch-Anweisung funktioniert wie diese. Der Fehler sagt "keine verdeckten Typ bool, string".
Jeder wissen, wenn ich die StartsWith in einem Switch oder brauche ich If...Else-Anweisungen?
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";
}
Sie müssen mithilfe von if/else.
Ich denke, man könnte noch den Schalter benutzen, der für alle anderen Werte und setzen die StartsWith-code in der default-Fall...
Ich denke, man könnte noch den Schalter benutzen, der für alle anderen Werte und setzen die StartsWith-code in der default-Fall...
InformationsquelleAutor Caverman | 2016-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie wechseln ein
String
, undsubArea.StartsWith()
gibt eineBoolean
, das ist, warum Sie es nicht tun. Ich schlage vor, Sie tun es so:Das Ergebnis das gleiche sein wird.
Ich bevorzuge diese Lösung, weil es nicht in verschachtelte Logik.
"Das Ergebnis wird dasselbe sein" - vorausgesetzt, keiner der Werte in der switch-Case-Anweisungen beginnen mit "3*" oder "03*".
Sorry, ich verstehe nicht, was du meinst. Wenn Sie sagen, dass die Fälle StartsWith "3*" und "03*" sind nicht abgedeckt, es gibt eine, wenn Sie vor dem Schalter. Wenn nicht, könnten Sie bitte erklären? Danke
InformationsquelleAutor appa yip yip
Den case-labels müssen strings sein, da der switch-Ausdruck ist eine Zeichenkette; jedoch
StartsWith
gibt einen booleschen Wert zurück. Ich schlage vor, die Behandlung dieser besonderen Fälle in derdefault
Abschnitt.Auch der Stern (*) ist vermutlich falsch, es sei denn, Sie wollen
subArea
enthalten es.StartWith
akzeptiert keine wildcards.Alternativ könnte man regex:
wo
^
bedeutet Anfang der Zeile und|
bedeutet oder.Wenn Sie regex verwenden, vergessen Sie nicht, zu entkommen, der star:
\*
.InformationsquelleAutor Olivier Jacot-Descombes
Joe Art mich zu schlagen, aber hier ist ein anderes non-Schalter Weg, es zu tun, die im wesentlichen implementiert eine pattern-matching-Algorithmus mit einem Regelwerk.
Vorteile
Nachteile
Verbesserungen
Tuple<string, string, Func<string, string, bool>>
mit einem semantischen Objekt repräsentiert eineRule
InformationsquelleAutor series0ne
Mit LINQ, die nette Antwort von @seriesOne werden kann "vereinfachte" ein bisschen durch den Austausch der
foreach
undreturn
Aussagen mit:InformationsquelleAutor DavidRR
Nur so zum Spaß, hier ' s eine andere Lösung, die vermeidet, dass die switch-Anweisung.
Die Reihenfolge im array
map
bestimmt die Priorität, so dass, zum Beispiel, können Sie eine exakte übereinstimmung auf, sagen wir, "3*11", sowie eineStartsWith
match auf "3*", z.B.:InformationsquelleAutor Joe
Dank der wenn-Klausel, können Sie jetzt tun:
InformationsquelleAutor Bhu