Получить строку, совпадающую с Any в LINQ

Мне нужно было проверить строку, чтобы увидеть, заканчивается ли она каким-либо массивом строк.

Я нашел идеальное решение, используя LINQ, выполнив этот ответ:

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

Теперь я хочу получить строку, которая совпала, и вот где я сейчас застрял.


Я пробовал добавить в конце

text_field.Text = x;

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

Any() возвращает логическое значение, если вы действительно чего-то хотите, попробуйте вместо этого FirstOrDefault(). Имейте в виду, что у вас может быть несколько совпадений, что вы собираетесь делать с остальными? Тебя волнует? Следует ли произвольно вернуть первый матч?
maccettura 01.05.2018 21:47

вы пытаетесь получить + в конце всей строки?

Simon Price 01.05.2018 21:51

@SimonPrice да, но только если он соответствует одному из массивов operators.

Patrick Gregorio 01.05.2018 21:52

Регулярное выражение - правильный ответ, но и мой тоже. Все сводится к тому, что вы предпочитаете

Simon Price 01.05.2018 21:53

@maccettura В моем случае я ожидаю получить только 1 соответствующий элемент или вообще ни одного. Не должно быть случаев, когда он соответствовал бы 2 или более operators.

Patrick Gregorio 01.05.2018 22:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы использовал для этого Regex

string test = "foo+";
var match = Regex.Match(test, @".+([\+\-\*\\])$").Groups[1].Value;

матч будет "", если строка не заканчивается на +-*/

Зачем вводить регулярное выражение для такого простого вопроса?

gilliduck 01.05.2018 21:50

@gilliduck какое правило ТАК я пропустил?

Eser 01.05.2018 21:51

Тот, в котором вы не усложняете ситуацию трудными для чтения / понимания ответами. Регулярное выражение слишком сложно для такой простой концепции, о которой спрашивает OP.

gilliduck 01.05.2018 21:52

@gilliduck Regex is way too involved, может быть, именно для вас?

Eser 01.05.2018 21:53

Хорошо, давайте уберем слишком много деталей. Regex - это другой ответ, чем тот, который запрашивал OP. Он спросил, как это сделать в LINQ. Вы не ответили на это.

gilliduck 01.05.2018 21:54

@gilliduck SO Мы должны ответить только на то, что OP спрашивает и не публикует другие альтернативы, которые могут работать? Что, если, например, пост - это проблема XY (я не имею в виду этот случай)?

Eser 01.05.2018 21:55

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

gilliduck 01.05.2018 21:58

Я в порядке с регулярным выражением. Я просто не знаю, как их писать, поэтому в этом случае я предпочитаю ответы LINQ. На случай, если кто-то не заметил, я использовал тот же код в ответе, на который ссылался. Чтобы изменить регулярное выражение, используя фактические строки, которые я должен тестировать, для меня немного работы. В любом случае - проголосовали за, так как кажется, что он работает regex101.com/r/5aT2eH/1

Patrick Gregorio 01.05.2018 22:01
Ответ принят как подходящий

Лучше всего сделать FirstOrDefault, а затем проверить, является ли он нулевым / пустым / и т. д., Как если бы это был ваш bool. Хотя это очень простой пример, он должен объяснить суть. Что вы будете делать с этим результатом, будет ли это один или несколько, и т. д. Зависит от ваших обстоятельств.

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

        string actualResult = operators.FirstOrDefault(x => test.EndsWith(x));

        if (result)
        {
            Console.WriteLine("Yay!");
        }

        if (!string.IsNullOrWhiteSpace(actualResult))
        {
            Console.WriteLine("Also Yay!");
        }
    }

Я не голосовал против, но разве это не должно быть operators.Where(x => test.EndsWith(x)).FirstOrDefault()?

Patrick Gregorio 01.05.2018 21:55

@ uom-pgregorio, нет, в данном случае они эквивалентны.

gilliduck 01.05.2018 21:59

@maccettura, вы в этом уверены, потому что я сейчас смотрю на это в Visual Studio, и, похоже, он работает нормально.

gilliduck 01.05.2018 22:03

@gilliduck неправильно прочитал, подумал, что результатом был string, и в этом случае if (result) не компилируется. Виноват!

maccettura 01.05.2018 22:03

Если я правильно понимаю, это даст вам оператора

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

Это вернет только последний использованный оператор, поэтому, если он заканчивается на - + *, он даст вам последний символ в строке

Я был бы признателен, если бы вы могли объяснить значение уценки, это правильный ответ, и он получает значение OP после

Simon Price 01.05.2018 21:55

Вероятно, просто Eser отрицательно относится ко всем ответам, кроме своего собственного удивительного решения Regex. Не дай Бог вам ответить в контексте вопроса.

gilliduck 01.05.2018 22:00

Однако это неправильный ответ. result не будет единственным оператором, который соответствует

maccettura 01.05.2018 22:01

Это жизнеспособный ответ, если OP понимает, что может быть одно или несколько возможных попаданий в их .Any (), и хочет знать любое или все из них. Мой ответ просто дает первое совпадение.

gilliduck 01.05.2018 22:02

Спасибо за пояснение, что это возвращает несколько обращений. В моем случае попаданий будет только 1 или 0, поскольку строка может заканчиваться только 1 символом. Хотя проголосовали за.

Patrick Gregorio 01.05.2018 22:05

@SimonPrice Я только указываю, что ваш ответ не дает соответствующего оператор, он дает совпадающий операторы. Возможно, стоит указать на это OP вместо того, чтобы давать другой ответ, чем они просили. Не сказать, что ваш подход плох, но это не то, о чем просил OP, поэтому вы должны объяснить, почему это лучше.

maccettura 01.05.2018 22:06

Другие вопросы по теме