Tôi đang tìm cách chuyển đổi một bộ sưu tập IEnumerable thành một bộ sưu tập IObservable mà không sử dụng các phương thức Rx ToObservable() và ToEnumerable().làm thế nào để chuyển đổi IEnumerable sang IObservable?
Trả lời
Câu trả lời đơn giản - sử dụng ToObservable
. Đó là những gì nó cho.
"Trả lời câu hỏi thực tế" câu trả lời - bạn có thể tránh sử dụng Subjects
qua Observable.Create
:
void Main()
{
var src = Enumerable.Range(0, 10);
var observable = Observable.Create<int>(obs =>
{
foreach(var item in src)
{
obs.OnNext(item);
}
return Disposable.Create(()=>{});
});
using(observable.Subscribe(Console.WriteLine))
{
Console.ReadLine();
}
}
Output:
0
1
2
3
4
5
6
7
8
9
Là' Disposable.Create (() => {}); 'khác với' Disposable.Empty'? – interlude
@interlude Không thực sự, tôi chỉ sử dụng quá tải để có thể thêm logic dọn dẹp nếu cần. – JerKimball
Nếu ta có một IEnumerable
không rõ loại, có hai cách một có thể "chuyển đổi nó thành IObservable":
Sao chép tất cả dữ liệu trong đối tượng vào một bộ sưu tập mới thực hiện
IObservable
. Nếu việc này được thực hiện, chỉ những thay đổi được thực hiện cho bộ sưu tập mới sẽ được báo cáo. Những thay đổi được thực hiện cho bản gốc sẽ không.Tạo đối tượng mới định kỳ sẽ chụp nhanh nội dung của số
IEnumerable
; sau khi chụp từng ảnh chụp, hãy báo cáo tất cả các thay đổi sẽ được thực hiện đối với ảnh chụp nhanh trước đó để làm cho ảnh chụp nhanh khớp với ảnh chụp mới. Sử dụng phương pháp này, những thay đổi được thực hiện cho đối tượng ban đầu sẽ được quan sát, cuối cùng, nhưng thật khó để cung cấp thông báo cập nhật kịp thời mà không lãng phí nhiều thời gian đọc lại bộ sưu tập khi không có gì thay đổi.
Có một số lần khi người ta cần phải có IObservable
ràng buộc với đối tượng gốc IEnumerable
, chứ không phải là một đối tượng mới đó là điền sẵn với một bản sao của dữ liệu; trong những trường hợp như vậy, cách tiếp cận thứ hai có thể là cần thiết. Tuy nhiên, thường sẽ không thể làm cho tỷ lệ bỏ phiếu đủ nhanh để cung cấp cập nhật kịp thời mà không gây ra tải hệ thống không được chấp nhận trừ khi bộ sưu tập gốc hỗ trợ các tính năng không có sẵn trong một tùy ý IEnumerable
. Hơn nữa, nếu người ta không áp đặt các yêu cầu về loại IEnumerable
, người ta có thể sẽ phải đặt ra các hạn chế về ngữ cảnh luồng mà nó có thể được cập nhật.
Tại sao bạn không muốn sử dụng 'ToObservable()'? –
@DanielHilgarth Tôi thừa nhận, tôi cũng tò mò - đó là điểm của 'ToObservable() ' – JerKimball