Tôi có chức năng chấp nhận Số đếm. Tôi cần đảm bảo rằng điều tra viên được đánh giá, nhưng tôi không muốn tạo bản sao của nó (ví dụ: thông qua ToList() hoặc ToArray()) nếu tất cả đã sẵn sàng trong Danh sách hoặc một số bộ sưu tập "cố định" khác. By Frozen Tôi có nghĩa là các bộ sưu tập nơi tập hợp các mục đã được thiết lập, ví dụ: Danh sách, mảng, FsharpSet, Bộ sưu tập, vv, như trái ngược với các công cụ LINQ như Select() và where().Có thể xác định xem một số IE2umercó bị vô hiệu hóa không?
Có thể tạo hàm "ForceEvaluation" có thể xác định xem có thể đếm được số thực thi đang chờ xử lý và sau đó đánh giá số đếm được không?
public void Process(IEnumerable<Foo> foos)
{
IEnumerable<Foo> evalutedFoos = ForceEvaluation(foos)
EnterLockedMode(); // all the deferred processing needs to have been done before this line.
foreach (Foo foo in foos)
{
Bar(foo);
}
}
public IEnumerable ForceEvaluation(IEnumerable<Foo> foos)
{
if(??????)
{ return foos}
else
{return foos.ToList()}
}
}
Sau khi một số nghiên cứu chi tiết tôi đã nhận ra rằng đây là khá nhiều không thể trong bất kỳ ý nghĩa thực tiễn, và sẽ yêu cầu kiểm tra mã phức tạp của mỗi iterator. Vì vậy, tôi sẽ đi với một biến thể của câu trả lời của Mark và tạo ra một danh sách trắng của các loại an toàn được biết đến và chỉ cần gọi ToList() bất cứ điều gì không có trên đó không có trong danh sách trắng.
Cảm ơn tất cả vì sự giúp đỡ của bạn.
Chỉnh sửa * Sau khi phản ánh nhiều hơn, tôi đã nhận ra rằng điều này tương đương với sự cố tạm dừng. Rất không thể.
Bạn có thể kiểm tra 'if (foos là IList)', mặc dù đây có thể là một hack. Điều này làm việc ngay cả khi 'foos' là một mảng. –
dasblinkenlight
Bạn muốn điều gì xảy ra với 'while (true) {yield return 1; } '? Tôi nghi ngờ bạn có thể làm điều gì sai. Ngoài ra, những người đang đề xuất 'if (foos là' IList ')' không nhận ra rằng 'IList ' * có thể * cũng được thực hiện một cách lười biếng. –
jason
"Trì hoãn thi hành" là một thuật ngữ rộng lớn, nó có thể có nghĩa là bất cứ thứ gì. Bạn đang cố gắng xử lý một trường hợp cụ thể (tức là 'IQueryable'). Nếu vậy, hãy kiểm tra kiểu 'IQueryable' và chạy' ToList() 'để chống lại điều đó). –