2010-05-09 10 views
15

Ich brauche in string.Endswith("") aus einem der folgenden Betreiber zu überprüfen: +,-,*,/Wie verwendet man string.Endswith, um auf mehrere Enden zu testen?

Wenn ich 20 Betreiber will ich nicht || Operator 19 Mal verwenden.

+0

Warum würden Sie nicht das verwenden möchten || Operator? Dafür ist es da. Wenn Sie an Lösungen denken können, die EndsWith nicht verwenden, verwenden sie dennoch das || operator – Stewart

+4

Lächerliche Einschränkungen = Hausaufgaben –

+3

@stewart: Wenn ich 20 Zeichen zu überprüfen habe, muss ich || verwenden Betreiber 19 mal. – neven

Antwort

27

Wenn Sie mit .NET 3.5 dann ist es ganz einfach mit LINQ:

string test = "foo+"; 
string[] operators = { "+", "-", "*", "/" }; 
bool result = operators.Any(x => test.EndsWith(x)); 
+0

LINQ ist immer der richtige Hammer für den Job :) – cjk

+1

Ich finde es klarer, nur ein Array zu verwenden, wenn Sie solche Dinge initialisieren: var operators = new [] {"+", "-", "*", "/" }; '. Oder einfach: bool result = new [] {"+", "-", "*", "/"}.Any(x => test.EndsWith (x));' – Svish

+0

@Swish: In Array geändert. :) –

0

Ist ein regex Ausdruck keine Option

8

Obwohl ein einfaches Beispiel, wie das wohl gut genug ist || verwenden, können Sie auch Regex dafür verwenden:

if (Regex.IsMatch(mystring, @"[-+*/]$")) { 
    ... 
} 
+4

Ich zögere persönlich, jemals RegEx zu empfehlen. Bei dem dargestellten Problem handelt es sich um die langsamste mögliche Lösung und um die komplexeste Lösung. – Stewart

+0

@Stewart: Ich würde nicht so weit gehen, zu zögern, Regex für jede Aufgabe zu empfehlen, aber ich muss zustimmen, dass es hier nicht die einfachste Methode ist. Mit regex ist es leicht, einen Fehler einzuführen, zum Beispiel in diesem Fall, wenn das OP mehr Zeichen einfügt, sollten sie vorsichtig sein, sie am Ende der Liste einzugeben. Wenn sie am Anfang hinzugefügt werden, würde der Bindestrich zu einem Bereich werden, der ein schwer zu findender Fehler sein könnte, wenn Sie nicht gewohnt sind, die Syntax zu regexieren. –

+3

Wissen Sie, die meisten Leute springen auf Regexes jedes Mal, wenn ein String-Problem auftritt, aber das ist eine Situation, in der ich denke, eine Regex * ist * sauber, prägnant, leicht zu verstehen und leicht zu pflegen ....... wenn Sie kennen Regexes. – mpen

2

Wenn Sie wirklich wollen, Sie kann De Morgans Gesetze verwenden, um x || y in Ihrem Code zu ersetzen. Eine Version sagt:

!(x || y) == !x && !y 

Wenn Sie das gleiche Ergebnis haben wollen, müssen wir nur noch zweimal den gesamten Ausdruck negieren:

x || y == !!(x || y) == !(!x && !y) 
+2

Total korrekt und funktionierend, aber ich würde nicht gerne in 6 Monaten nach einem Bug suchen. – Stewart

+0

Dies hat keine Relevanz für die Frage. –

2

Testen Sie das letzte Zeichen der Zeichenfolge mit String.IndexOfAny(Char[], Int32) Methode (str Annahme ist Ihre Variable):

str.IndexOfAny(new char[] {'+', '-', '*', '/'}, str.Length - 1) 

vollständiger Ausdruck:

str.Lenght > 0 ? str.IndexOfAny(new char[] {'+', '-', '*', '/'}, str.Length - 1) != -1 : false 
+0

Schön, aber es geht davon aus, dass alle Bediener nur aus einem Zeichen bestehen. –

+0

Ja, es ist ein Problem. Zum Testen der Länge der Zeichenfolge ist> = 1 erforderlich. –

0

das völlige Fehlen von Kontext gegeben, würde diese Lösung, die schlechter als mit einem einfachen || Operator Gebrauch sein, ist:

Boolean check = false; 
if (myString.EndsWith("+")) 
    check = true; 

if (!check && myString.EndsWith("-")) 
    check = true; 

if (!check && myString.EndsWith("/")) 
    check = true; 

etc. 
4
string s = "Hello World +"; 
string endChars = "+-*/"; 

Verwendung eine Funktion:

private bool EndsWithAny(string s, params char[] chars) 
{ 
    foreach (char c in chars) 
    { 
     if (s.EndsWith(c.ToString())) 
      return true; 
    } 
    return false; 
} 

bool endsWithAny = EndsWithAny(s, endChars.ToCharArray()); //use an array 
bool endsWithAny = EndsWithAny(s, '*', '/', '+', '-');  //or this syntax 

LINQ verwenden:

bool endsWithAny = endChars.Contains(s.Last()); 

Mit TrimEnd:

bool endsWithAny = s.TrimEnd(endChars.ToCharArray()).Length < s.Length; 
// als possible s.TrimEnd(endChars.ToCharArray()) != s; 
2

Wie etwa: -

string input = .....; 
string[] matches = { ...... whatever ...... }; 

foreach (string match in matches) 
{ 
    if (input.EndsWith(match)) 
     return true; 
} 

weiß, dass ich es fürchterlich alte Schule ist LINQ in diesem Zusammenhang zu vermeiden, aber ein Tag müssen Sie diesen Code lesen. Ich bin absolut sicher, dass LINQ seinen Nutzen hat (vielleicht werde ich sie eines Tages finden), aber ich bin mir ziemlich sicher, dass es nicht die vier obigen Codezeilen ersetzen soll.

+1

Yessir. Ich würde sagen Regexes oder diese Antwort. – mpen

+0

Sie mögen keine Regexes, Sie mögen LINQ nicht ... nicht wegen irgendeines Problems mit ihnen, aber weil Sie sie nicht lesen können. Das ist dein Problem. –

0

Mit String.IndexOf(String):

str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false 
Verwandte Themen