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.
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.
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));
LINQ jest zawsze poprawnym młotkiem do pracy :) – cjk
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
@Svish: Zmieniono na tablicę. :) –
Czy regex ekspresja nie jest opcją
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, @"[-+*/]$")) {
...
}
Ja osobiście waham się, aby kiedykolwiek polecić RegEx. W przedstawionym problemie chodzi o najwolniejsze rozwiązanie, a także o najbardziej skomplikowane. – Stewart
@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. –
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
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)
Całkowicie poprawne i działające, ale nie chciałbym tego czytać za 6 miesięcy szukając błędu. – Stewart
Nie ma to znaczenia dla pytania. –
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
Przyjemnie, ale zakłada, że wszyscy operatorzy składają się z tylko jednego znaku. –
Tak, to jest problem. Aby przetestować długość ciągu, należy> = 1. –
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.
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;
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.
Yessir. Powiedziałbym, że wyrażenia regularne lub ta odpowiedź. – mpen
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. –
Korzystanie String.IndexOf(String)
:
str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false
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
Ridiculous Restrictions = Praca domowa –
@stewart: Jeśli mam 20 ciągów do sprawdzenia, muszę użyć || operator 19 razy. – neven