2011-01-18 14 views
6

मैं .NET 4 पर आरएक्स ढांचे में अपना पहला कदम उठा रहा हूं। मैं List<int> या Dictionary<x,x> जैसे संग्रह को देखने का प्रयास कर रहा हूं। और जब संग्रह में कोई आइटम जोड़ा जाता है तो यह कंसोल में ToString() लिख देगा।संग्रह पर पर्यवेक्षक

कोई विचार? या कुछ कोड नमूने धन्यवाद

उत्तर

9

List<T> और Dictionary<TKey, TValue> देखने योग्य नहीं हैं (वे परिवर्तन करते समय ईवेंट नहीं बढ़ाते हैं), इसलिए आरएक्स के लिए हुक करने के लिए कुछ भी नहीं है।

List के लिए, आप ObservableCollection<T> का उपयोग कर सकते हैं, लेकिन आपको इसकी घटनाओं को आरएक्स से उपयोग करने के लिए लपेटना होगा।

ObservableCollection<int> collection = 
    new ObservableCollection<int>(new int[] { 1, 2, 3 }); 

collection.GetObservableAddedValues().Subscribe(
    i => Console.WriteLine("{0} was added", i) 
); 

कोई है:

public static class ObservableCollectionExtensions 
{ 
    public static IObservable<IEvent<NotifyCollectionChangedEventArgs>> 
     GetObservableChanges<T>(this ObservableCollection<T> collection) 
    { 
     return Observable.FromEvent< 
      NotifyCollectionChangedEventHandler, NotifyCollectionChangedArgs>(
       h => new NotifyCollectionChangedEventHandler(h), 
       h => collection.CollectionChanged += h, 
       h => collection.CollectionChanged -= h 
      ); 
    } 

    public static IObservable<T> GetObservableAddedValues<T>(
     this ObservableCollection<T> collection) 
    { 
     return collection.GetObservableChanges() 
      .Where(evnt => evnt.EventArgs.Action == NotifyCollectionChangedAction.Add) 
      .SelectMany(evnt => evnt.EventArgs.NewItems.Cast<T>()); 
    } 
} 

मैं एक अतिरिक्त सहायक है कि केवल एक IObservable<T> के रूप में नए जोड़े गए आइटम, जो आप इस तरह उपयोग कर सकते हैं को उजागर करता है को शामिल किया है: यहाँ एक उदाहरण का उपयोग करते हुए विस्तार के तरीकों है ढांचे में देखने योग्य शब्दकोश, हालांकि ObservableDictionary codeplex project उस अंतर को भरने लगता है और मुझे यकीन है कि इसे एक ही तरीके से लपेटा जा सकता है। ReactiveUI से

1

उपयोग ReactiveCollection:

var c = new ReactiveCollection<int>(); 
c.Changed.Subscribe(x => Console.Writeln(x.Value); 
c.Add(1); 
+0

आप इसे की कोशिश की? और इसके बजाय पर्यवेक्षण चयन का उपयोग क्यों नहीं कर रहे हैं? – guyl

संबंधित मुद्दे