Điều này phải là một cái gì đó thực sự đơn giản. Nhưng tôi sẽ hỏi nó, bởi vì tôi nghĩ rằng những người khác cũng sẽ đấu tranh với nó. Tại sao truy vấn LINQ đơn giản sau đây không được thực hiện luôn với biến-giá trị mới thay vì luôn sử dụng giá trị đầu tiên?Thực hiện hoãn lại của LINQ, nhưng làm cách nào?
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();
}
Trong mẫu nhận xét, nó sẽ nhập vòng lặp do đầu vào ABC123
chứa chữ số. Nhưng nó sẽ không bao giờ rời khỏi nó ngay cả khi bạn nhập một cái gì đó như ABC
từ digits
vẫn là 123
.
Vậy tại sao truy vấn LINQ không đánh giá giá trị input
mới nhưng luôn là giá trị đầu tiên?
Tôi biết tôi có thể sửa chữa nó với dòng này thêm:
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
}
hoặc - thanh lịch hơn - bằng cách sử dụng các truy vấn trực tiếp trong vòng lặp:
while (input.Any(Char.IsDigit))
{
// ...
}
Khi bạn chuyển một biến cho hàm dưới dạng tham số, biến đó được chuyển theo giá trị. –
Một đoạn mã đơn giản như vậy, với những tác dụng phụ phức tạp như vậy. –
Bò thánh, bạn có câu trả lời từ Raymond Chen ™ thực tế! –