Das muss etwas wirklich einfaches sein. Aber ich werde es trotzdem fragen, weil ich denke, dass andere auch damit kämpfen werden. Warum wird die folgende einfache LINQ-Abfrage nicht immer mit dem neuen Variablenwert ausgeführt, statt immer den ersten zu verwenden?LINQs verzögerte Ausführung, aber wie?
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();
}
In der kommentierten Proben wird er die Schleife eingeben, da der Eingang ABC123
Ziffern enthält. Aber es wird es nie verlassen, auch wenn Sie so etwas wie ABC
eingeben, da digits
immer noch 123
ist.
Warum also die LINQ-Abfrage nicht den neuen input
-Wert auswerten, sondern immer den ersten?
weiß ich, ich es mit dieser zusätzlichen Zeile beheben könnte:
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
}
oder - eleganter - durch die Abfrage direkt in der Schleife:
while (input.Any(Char.IsDigit))
{
// ...
}
Wenn Sie eine Variable als Parameter an eine Funktion übergeben, wird sie als Wert übergeben. –
Solch ein einfaches Stück Code mit solch komplexen Nebenwirkungen. –
Heilige Kuh, du hast eine Antwort von The Actual Raymond Chen ™ erhalten! –