2010-05-09 20 views
15

muszę sprawdzić w string.Endswith("") z jednego z następujących operatorów: +,-,*,/Jak używać string.Endswith do testowania wielu zakończeń?

Jeśli mam 20 operatorów nie chcę używać || operatorowi 19 razy.

+0

Dlaczego nie chcesz używać || operator? Po to jest to. Jeśli można myśleć o rozwiązaniach, które nie używają EndsWith, ale nadal używają || operator – Stewart

+4

Ridiculous Restrictions = Praca domowa –

+3

@stewart: Jeśli mam 20 ciągów do sprawdzenia, muszę użyć || operator 19 razy. – neven

Odpowiedz

27

Jeśli używasz .NET 3.5 to jest dość łatwe LINQ:

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

LINQ jest zawsze poprawnym młotkiem do pracy :) – cjk

+1

Uważam, że lepiej jest używać tablicy podczas inicjowania takich rzeczy: var operatory = nowe [] {"+", "-", "*", "/" }; '. Lub po prostu: bool result = new [] {"+", "-", "*", "/"}.Any(x => test.EndsWith (x));' – Svish

+0

@Svish: Zmieniono na tablicę. :) –

8

Chociaż prosty przykład jak to jest chyba wystarczająco dobry użyciu ||, można również użyć wyrażenia regularnego do niego:

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

Ja osobiście waham się, aby kiedykolwiek polecić RegEx. W przedstawionym problemie chodzi o najwolniejsze rozwiązanie, a także o najbardziej skomplikowane. – Stewart

+0

@Stewart: Nie posunąłbym się aż tak daleko, żeby zawęzić rekomendację do wyrażenia regularnego dla każdego zadania, ale muszę się zgodzić, że nie jest to najprostsza metoda. W przypadku wyrażenia regularnego łatwo jest wprowadzić błąd, na przykład w tym przypadku, gdy OP wstawia więcej znaków, należy uważać, aby wprowadzić je na końcu listy. Jeśli zostaną dodane na początku, łącznik stanie się zasięgiem, który może być trudnym do znalezienia błędem, jeśli nie używasz do wyodrębniania składni. –

+3

Wiesz, większość ludzi przeskakuje na wyrażeń regularnych za każdym razem, gdy pojawia się problem z ciągami znaków, ale jest to jedna z sytuacji, w których myślę, że wyrażenie regularne * jest * czyste, zwięzłe, łatwe do zrozumienia i łatwe w utrzymaniu ....... znasz wyrażenia regularne. – mpen

2

Jeśli naprawdę chcesz, ty może użyć praw De Morgana, aby zastąpić kod x || y. Jedna z wersji mówi:

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

Jeśli chcesz mieć ten sam rezultat, musimy tylko do zanegowania całego wyrażenia dwukrotnie:

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

Całkowicie poprawne i działające, ale nie chciałbym tego czytać za 6 miesięcy szukając błędu. – Stewart

+0

Nie ma to znaczenia dla pytania. –

2

test ostatni znak łańcucha przy użyciu String.IndexOfAny(Char[], Int32) sposób (zakładając str jest zmienna):

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

pełna ekspresji:

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

Przyjemnie, ale zakłada, że ​​wszyscy operatorzy składają się z tylko jednego znaku. –

+0

Tak, to jest problem. Aby przetestować długość ciągu, należy> = 1. –

0

względu na zupełny brak kontekstu byłoby to rozwiązanie, które jest gorsze niż przy łatwym || operator być użytku:

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 = "+-*/"; 

Używanie funkcja:

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 

Używanie LINQ:

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

Korzystanie TrimEnd:

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

Jak o: -

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

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

wiem, że to jest strasznie stara szkoła, aby uniknąć LINQ w tym kontekście, ale jeden w dniu, w którym będziesz musiał przeczytać ten kod. Jestem absolutnie pewien, że LINQ ma swoje zastosowania (może kiedyś je znajdę), ale jestem pewien, że nie ma to na celu zastąpienia czterech linii kodu powyżej.

+1

Yessir. Powiedziałbym, że wyrażenia regularne lub ta odpowiedź. – mpen

+0

Nie lubisz wyrażeń regularnych, nie lubisz LINQ ... nie z powodu jakiegokolwiek problemu z nimi, ale dlatego, że nie możesz ich odczytać. To całkowicie twój problem. –

0

Korzystanie String.IndexOf(String):

str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false 
Powiązane problemy