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

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

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

Ответы

Ответ 1

Если вы используете .NET 3.5, это довольно легко с LINQ:

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

Как насчет: -

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

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

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

Ответ 7

Является regex выражение не опция

Ответ 8

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

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

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

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

etc.

Ответ 9

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

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