Tôi thỉnh thoảng trong trường hợp tôi phải xử lý nhiều lần nhiều lần. Nếu liệt kê là tốn kém, không lặp lại và sinh ra rất nhiều dữ liệu (như một IQueryable đọc từ một cơ sở dữ liệu), liệt kê nhiều lần không phải là một lựa chọn, không phải là đệm kết quả trong bộ nhớ.
Cho đến hôm nay tôi thường kết thúc viết các lớp tổng hợp mà tôi có thể đẩy các mục trong vòng lặp foreach và cuối cùng đọc kết quả - ít thanh lịch hơn LINQ.
Nhưng chờ đã, tôi vừa nói "đẩy"? Nghe có vẻ như ... phản ứng không? Vì vậy, tôi đã suy nghĩ trong khi đi bộ đêm nay. Trở về nhà tôi đã thử nó - và nó hoạt động!
Ví dụ đoạn mã cho thấy làm thế nào để có được cả hai mức tối thiểu và các mặt hàng tối đa từ một chuỗi các số nguyên trong một pass duy nhất, sử dụng khai thác LINQ chuẩn (những Rx, có nghĩa là):
public static MinMax GetMinMax(IEnumerable<int> source)
{
// convert source to an observable that does not enumerate (yet) when subscribed to
var connectable = source.ToObservable(Scheduler.Immediate).Publish();
// set up multiple consumers
var minimum = connectable.Min();
var maximum = connectable.Max();
// combine into final result
var final = minimum.CombineLatest(maximum, (min, max) => new MinMax { Min = min, Max = max });
// make final subscribe to consumers, which in turn subscribe to the connectable observable
var resultAsync = final.GetAwaiter();
// now that everybody is listening, enumerate!
connectable.Connect();
// result available now
return resultAsync.GetResult();
}
Đây không phải là một trả lời cho câu hỏi, đó là "Có thể gọi các phương thức Linq trên IEnumerable nhiều lần không?" ... câu trả lời là không". –
Vâng, những gì "OK" có nghĩa là một chút không rõ ràng. Bạn có thể lặp qua danh sách tuy nhiên nhiều lần bạn muốn. Tôi đề cập đến các chi tiết của điều này trong câu trả lời của tôi. Làm thế nào là nó không OK để lặp qua chúng? Đăng câu trả lời của riêng bạn nếu bạn nghĩ vậy (mặc dù đã có câu trả lời được chấp nhận). –
Nó hoàn toàn rõ ràng. 'items' là một IEnumerable, không phải là một danh sách và bạn chỉ có thể duyệt qua nó một lần. Không cần phải đăng câu trả lời khác, nhưng điều quan trọng là người đọc phải hiểu rằng câu trả lời này là sai và thậm chí không chạm vào câu hỏi. –