2013-06-06 49 views
6

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?

+7

Tại sao bạn không muốn sử dụng 'ToObservable()'? –

+0

@DanielHilgarth Tôi thừa nhận, tôi cũng tò mò - đó là điểm của 'ToObservable() ' – JerKimball

Trả lời

7

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 
+0

Là' Disposable.Create (() => {}); 'khác với' Disposable.Empty'? – interlude

+1

@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

1

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.

Các vấn đề liên quan