Мне нужно было проверить строку, чтобы увидеть, заканчивается ли она каким-либо массивом строк.
Я нашел идеальное решение, используя LINQ, выполнив этот ответ:
string test = "foo+";
string[] operators = { "+", "-", "*", "/" };
bool result = operators.Any(x => test.EndsWith(x));
Теперь я хочу получить строку, которая совпала, и вот где я сейчас застрял.
Я пробовал добавить в конце
text_field.Text = x;
и это было ошибкой с сообщением об области - и справедливо, я ожидал эту ошибку. Я также попытался объявить строковую переменную с именем x
на самом верху, и из-за этого возникла другая ошибка - что-то о невозможности повторно объявить переменную в другой области. Думаю, я так привык к PHP, где вы можете без проблем повторно объявить переменную.
вы пытаетесь получить + в конце всей строки?
@SimonPrice да, но только если он соответствует одному из массивов operators
.
Регулярное выражение - правильный ответ, но и мой тоже. Все сводится к тому, что вы предпочитаете
@maccettura В моем случае я ожидаю получить только 1 соответствующий элемент или вообще ни одного. Не должно быть случаев, когда он соответствовал бы 2 или более operators
.
Я бы использовал для этого Regex
string test = "foo+";
var match = Regex.Match(test, @".+([\+\-\*\\])$").Groups[1].Value;
матч будет ""
, если строка не заканчивается на +-*/
Зачем вводить регулярное выражение для такого простого вопроса?
@gilliduck какое правило ТАК я пропустил?
Тот, в котором вы не усложняете ситуацию трудными для чтения / понимания ответами. Регулярное выражение слишком сложно для такой простой концепции, о которой спрашивает OP.
@gilliduck Regex is way too involved
, может быть, именно для вас?
Хорошо, давайте уберем слишком много деталей. Regex - это другой ответ, чем тот, который запрашивал OP. Он спросил, как это сделать в LINQ. Вы не ответили на это.
@gilliduck SO Мы должны ответить только на то, что OP спрашивает и не публикует другие альтернативы, которые могут работать? Что, если, например, пост - это проблема XY (я не имею в виду этот случай)?
это все хорошо, если есть хорошее указание на это, но в вопросе OP нет указаний на то, что что-либо, кроме метода LINQ, лучше. Вопрос был о LINQ, ответ должен быть о LINQ, если только ответ не выполнимый или более сложный, чем можно сделать с помощью другого метода.
Я в порядке с регулярным выражением. Я просто не знаю, как их писать, поэтому в этом случае я предпочитаю ответы LINQ. На случай, если кто-то не заметил, я использовал тот же код в ответе, на который ссылался. Чтобы изменить регулярное выражение, используя фактические строки, которые я должен тестировать, для меня немного работы. В любом случае - проголосовали за, так как кажется, что он работает regex101.com/r/5aT2eH/1
Лучше всего сделать 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()
?
@ uom-pgregorio, нет, в данном случае они эквивалентны.
@maccettura, вы в этом уверены, потому что я сейчас смотрю на это в Visual Studio, и, похоже, он работает нормально.
@gilliduck неправильно прочитал, подумал, что результатом был string
, и в этом случае if (result)
не компилируется. Виноват!
Если я правильно понимаю, это даст вам оператора
string test = "foo+";
string[] operators = { "+", "-", "*", "/" };
var result = operators.Where(x => test.EndsWith(x)) ;
Это вернет только последний использованный оператор, поэтому, если он заканчивается на - + *, он даст вам последний символ в строке
Я был бы признателен, если бы вы могли объяснить значение уценки, это правильный ответ, и он получает значение OP после
Вероятно, просто Eser отрицательно относится ко всем ответам, кроме своего собственного удивительного решения Regex. Не дай Бог вам ответить в контексте вопроса.
Однако это неправильный ответ. result
не будет единственным оператором, который соответствует
Это жизнеспособный ответ, если OP понимает, что может быть одно или несколько возможных попаданий в их .Any (), и хочет знать любое или все из них. Мой ответ просто дает первое совпадение.
Спасибо за пояснение, что это возвращает несколько обращений. В моем случае попаданий будет только 1 или 0, поскольку строка может заканчиваться только 1 символом. Хотя проголосовали за.
@SimonPrice Я только указываю, что ваш ответ не дает соответствующего оператор, он дает совпадающий операторы. Возможно, стоит указать на это OP вместо того, чтобы давать другой ответ, чем они просили. Не сказать, что ваш подход плох, но это не то, о чем просил OP, поэтому вы должны объяснить, почему это лучше.
Any()
возвращает логическое значение, если вы действительно чего-то хотите, попробуйте вместо этогоFirstOrDefault()
. Имейте в виду, что у вас может быть несколько совпадений, что вы собираетесь делать с остальными? Тебя волнует? Следует ли произвольно вернуть первый матч?