2015-01-20 72 views
1

我想將多個可觀察元素(每個元素都返回一個Update對象)組合到單個字典對象中。將多個可觀察元素合併到單個字典中

這裏是什麼,我想實現一個樣本:

private IObservable<IDictionary<string, IUpdate>> CreateUpdateStreams(Product product) 
{ 
    var codeObservables = product.Codes.Select(code => CreateUpdateStream(code)).ToList(); 

    //??? 
    return pointObs.Merge().Select(update => ...); 
} 


private IObservable<IUpdate> CreateUpdateStream(string code) 
{ 
    ... 
    //return an observable of IUpdate 
} 
  • 我想,因爲他們進來到一個單一,更新詞典結合所有IUpdates的其中關鍵=代碼和值= IUpdate
  • CreateUpdateStreams的調用者將知道該產品,並希望根據更新對每個Code對象的某些屬性進行更改。例如

產品=富

Product.Codes = {代碼1,代碼2,CODE3}

IDictionary的= {代碼1, 「A」},{代碼2, 「B」},{CODE3 ,「c」}

根據更新的值(在本例中爲a/b/c),將對相應的代碼進行不同的更改,例如設置一個屬性,如Code.State =「a」等

由於每個codeObservables將更新以不同的價格,Merge似乎是一個明智的起點。我不確定如何從各個observables更新更新字典對象,它保留了過去的值。

+0

IUpdate是什麼樣的? – Enigmativity 2015-01-21 05:43:07

+0

希望我做對了:),你需要Product.Codes.State,如果我是正確的重新思考你的實現和使用元組字典(元組與對象,螺母只是字符串)http://www.codeproject.com/Articles/193537/C-Tuples或http://stackoverflow.com/questions/955982/tuples-or-arrays-as-dictionary-keys-in-c-sharp – SilentTremor 2015-01-21 08:27:09

回答

2

這是您的問題的一個鏡頭,它利用了匿名類型。它依賴副作用字典。請注意,由於Rx保證順序行爲,因此不需要在字典上進行同步。

private IObservable<IReadOnlyDictionary<string, IUpdate>> CreateUpdateStreams(Product product) 
    { 
     var dictionary = new Dictionary<string, IUpdate>(); 
     return 
      product.Codes.Select(
       code => CreateUpdateStream(code).Select(update => new {Update = update, Code = code})) 
       .Merge() 
       .Do(element => dictionary.Add(element.Code, element.Update)) 
       .Select(_ => dictionary); 
    } 

請注意,我已經改變了方法簽名返回IObservable<IReadOnlyDictionary<,>>,以防止客戶端代碼從字典中被篡改。另一種選擇是每次返回字典的新副本。這可以確保不可變的行爲(但可能會影響性能,具體取決於字典的大小),如下所示:

private IObservable<IDictionary<string, IUpdate>> CreateUpdateStreams(Product product) 
    { 
     var dictionary = new Dictionary<string, IUpdate>(); 
     return 
      product.Codes.Select(
       code => CreateUpdateStream(code).Select(update => new {Update = update, Code = code})) 
       .Merge() 
       .Select(element => 
       { 
        dictionary.Add(element.Code, element.Update); 
        return new Dictionary<string, IUpdate>(dictionary); 
       }); 
    } 
+3

替換你本地的'dictionary'變量和'Do'和'用'Scan(新字典(),(dict,e)=> {dict.Add(e.Code,e.Update); return dict;})'選擇'。另外,如果不變性很重要,請使用[ImmutableDictionary](http://blogs.msdn.com/b/bclteam/p/immutable.aspx) – Brandon 2015-01-21 14:23:35

相關問題