Это должно быть что-то действительно простое. Но я все равно спрошу об этом, потому что я думаю, что другие будут бороться с этим. Почему следующий простой запрос LINQ не всегда выполняется с новым значением переменной, а не всегда с использованием первого?
static void Main(string[] args)
{
Console.WriteLine("Enter something:");
string input = Console.ReadLine(); // for example ABC123
var digits = input.Where(Char.IsDigit); // 123
while (digits.Any())
{
Console.WriteLine("Enter a string which doesn't contain digits");
input = Console.ReadLine(); // for example ABC
}
Console.WriteLine("Bye");
Console.ReadLine();
}
В прокомментированном примере он войдет в цикл, так как вход ABC123
содержит цифры. Но он никогда не покинет его, даже если вы введете что-то вроде ABC
, так как digits
все еще есть 123
.
Итак, почему запрос LINQ не оценивает новое значение input
, но всегда первое?
Я знаю, что могу исправить это с помощью этой дополнительной строки:
while (digits.Any())
{
Console.WriteLine("Enter a string which doesn't contain digits");
input = Console.ReadLine();
digits = input.Where(Char.IsDigit); // now it works as expected
}
или - более элегантный - используя запрос непосредственно в цикле:
while (input.Any(Char.IsDigit))
{
// ...
}