2014-07-10 51 views
2

在我的Rx代碼中,我使用GroupBy創建IObservable<IGroupedObservable<T>>。從那裏我希望對IGroupedObservable進行一些轉換,同時保持關於組的知識(Key)。使用和維護IGroupedObservable

例如,

IObservable<IGroupedObservable<T>> CreateGroup(this IObservable<T> obs) 
{ 
    return obs.GroupBy(o => o.Something); 
} 

IGroupedObservable<A> Foo(this IGroupedObservable<T> obs) 
{ 
    return obs.Select(o => new A(o)); 
} 

IGroupedObservable<B> Bar(this IGroupedObservable<A> obs) 
{ 
    return obs.Select(o => new B(o)); 
} 

IObservable<IGroupedObservable<B>> stillGrouped = initialObservable.CreateGroup().Select(grouped => grouped.Foo().Bar()); 

當然,我不能這樣做,因爲在富的Select()失去IGroupedObservable的煩躁。

有沒有人看到過這個解決方案?

編輯TLDR我試圖撰寫依賴於可觀察已被分組操作,和我喜歡的類型系統來執行這對我來說。我想我可以讓這些操作採用組Key,並在前面執行一個Where Key,但是這樣會變得越來越混亂。

回答

2

嗯。

一個蠻力的方法是複製你需要的observable方法。像這樣:

private class GroupedObservable<TKey, TElement> : IGroupedObservable<TKey, TElement> 
{ 
    private readonly IObservable<TElement> _o; 
    private readonly TKey _k; 

    public TKey Key { get { return _k } } 

    public GroupedObservable(TKey key, IObservable<TElement> o) 
    { 
     _key = key; 
     _o = ; 
    } 

    public IDisposable Subscribe(IObserver<TElement> observer) { return _o.Subscribe(observer); } 
} 

public static IGroupedObservable<TKey, TResult> Select<TKey, TSource, TResult>(this IGroupedObservable<TKey, TSource> source, Func<TSource, TResult> selector) 
{ 
    return new GroupedObservable<TKey, TResult>(source.Key, ((IObservable<TSource>)source).Select(selector)); 
} 

隨着時間的推移,你會建立一個你需要的方法庫。

另一種簡單的方法是隻使用Select改變你IGroupedObservable<TKey, TElement>IObservable<KeyValuePair<TKey, TElement>>

public static IObservable<KeyValuePair<TKey, TValue>> ToKV<TKey, TValue>(this IGroupedObservable<TKey, TValue> g) 
{ 
    return g.Select(v => new KeyValuePair<TKey, TValue>(g.Key, v)); 
} 

initialObservable.CreateGroup().Select(group => group.ToKV()); 
+0

是啊,這第一個選擇可能就是我會去。我希望[rxx](http://rxx.codeplex.com/)或其他一些庫可以創建這些擴展:(。 – Anthony