Как использовать строку. Endswith для тестирования на несколько окончаний?

Я должен зарегистрироваться string.Endswith("") от любого из следующих операторов: +,-,*,/

Если у меня есть 20 операторов, я не хочу использовать || времена оператора 19.

19
задан Liam 15 December 2017 в 12:14
поделиться

9 ответов

Если вы используете .NET 3.5, то это довольно просто с помощью LINQ:

string test = "foo+";
string[] operators = { "+", "-", "*", "/" };
bool result = operators.Any(x => test.EndsWith(x));
40
ответ дан 30 November 2019 в 02:14
поделиться
string s = "Hello World +";
string endChars = "+-*/";

Использование функции:

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:

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

Использование TrimEnd:

bool endsWithAny = s.TrimEnd(endChars.ToCharArray()).Length < s.Length;
// als possible s.TrimEnd(endChars.ToCharArray()) != s;
4
ответ дан 30 November 2019 в 02:14
поделиться

Как насчет: -

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

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

Я знаю, что избегать LINQ в этом контексте - ужасно старая школа, но однажды вам нужно будет прочитать этот код. Я абсолютно уверен, что LINQ имеет свое применение (возможно, однажды я их найду), но я совершенно уверен, что он не предназначен для замены четырех строк кода выше.

3
ответ дан 30 November 2019 в 02:14
поделиться

Хотя такой простой пример, вероятно, достаточно хорош, используя || , вы также можете использовать для этого Regex:

if (Regex.IsMatch(mystring, @"[-+*/]$")) {
  ...
}
9
ответ дан 30 November 2019 в 02:14
поделиться

Если вы действительно хотите, вы можете использовать законы Де Моргана для замены x || y в вашем коде. Одна из версий гласит:

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

Если вы хотите получить тот же результат, нам просто нужно дважды отрицать все выражение:

x || y == !!(x || y) == !(!x && !y)
2
ответ дан 30 November 2019 в 02:14
поделиться

Не является ли выражение регулярным выражением вариантом

0
ответ дан 30 November 2019 в 02:14
поделиться

Учитывая полное отсутствие контекста, будет ли полезно это решение, которое хуже, чем использование простого оператора ||:

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

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

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

etc.
0
ответ дан 30 November 2019 в 02:14
поделиться

Использование String.IndexOf (String) :

str.Lenght > 0 ? "+-*/".IndexOf(str[str.Lenght - 1]) != -1 : false
0
ответ дан 30 November 2019 в 02:14
поделиться

Проверьте последний символ строки, используя String. IndexOfAny(Char[], Int32) (предполагая, что str - ваша переменная):

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

Полное выражение:

str.Lenght > 0 ? str.IndexOfAny(new char[] {'+', '-', '*', '/'}, str.Length - 1) != -1 : false
2
ответ дан 30 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: