Nếu tôi sử dụng:
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
các Add
trong foreach
ném một InvalidOperationException (Bộ sưu tập đã được sửa đổi; hoạt động liệt kê không thể thực hiện), mà tôi cân nhắc hợp lý, vì chúng ta đang kéo tấm thảm từ dưới chân chúng ta.
Tuy nhiên, nếu tôi sử dụng:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
nó nhanh chóng tự bắn vào chân bằng cách lặp lại cho đến khi ném ra OutOfMemoryException.
Điều này làm tôi ngạc nhiên, vì tôi luôn nghĩ rằng List.ForEach chỉ là một trình bao bọc cho foreach
hoặc cho for
.
Có ai có lời giải thích cho cách thức và lý do tại sao của hành vi này?
(Được thúc đẩy bởi vòng lặp ForEach cho một Danh sách chung được lặp lại liên tục )