2013-02-28 66 views
1

我想爲我的字典寫一個合併擴展方法。如何更新擴展方法中的字典元素?

我真的很喜歡solutionMerging dictionaries in C#

我想修改上面的解決方案,如果更新鍵退出字典項。我不想使用Concurrent字典。有任何想法嗎 ?

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second) 
     { 
      if (second == null) return; 
      if (first == null) first = new Dictionary<TKey, TValue>(); 
      foreach (var item in second) 
      { 
       if (!first.ContainsKey(item.Key)) 
       { 
        first.Add(item.Key, item.Value); 
       } 
       else 
       { 
        **//I Need to perform following update . Please Help 
        //first[item.Key] = first[item.key] + item.Value** 
       } 
      } 
     } 
+0

你應該提供一些例子投入和預期輸出。 – 2013-02-28 22:04:44

+0

它完全取決於你對任意「TValue」的「合併」的含義。數字類型可以以與字符串或任意對象等不同的方式進行合併。一種選擇是提供'merge'委託作爲參數,以便調用者可以指定如何合併重複鍵的值。 – dlev 2013-02-28 22:05:49

回答

4

那麼,如果你想要結果包含兩個值,你需要一些方法來組合它們。如果你想「添加」值,那麼你需要定義一些組合兩個項目的方法,因爲你不知道TValue是否定義了一個+運算符。一種選擇是在把它作爲一個代表:

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first 
    , IDictionary<TKey, TValue> second 
    , Func<TValue, TValue, TValue> aggregator) 
{ 
    if (second == null) return; 
    if (first == null) throw new ArgumentNullException("first"); 
    foreach (var item in second) 
    { 
     if (!first.ContainsKey(item.Key)) 
     { 
      first.Add(item.Key, item.Value); 
     } 
     else 
     { 
      first[item.Key] = aggregator(first[item.key], item.Value); 
     } 
    } 
} 

要調用它看起來像:

firstDictionary.Merge(secondDictionary, (a, b) => a + b); 

雖然它也常常像這樣的合併操作要挑兩個項目之一,以保持,無論是第一個還是第二個(請注意,您可以使用上述功能,通過使用適當的aggregator實現)。

例如,要始終保持項目的第一本詞典可以使用:

firstDictionary.Merge(secondDictionary, (a, b) => a); 

要始終與第二替換:

firstDictionary.Merge(secondDictionary, (a, b) => b); 
+0

Servy,非常感謝您的解決方案。這是一個非常快速的迴應。對此,我真的非常感激。 – Think 2013-02-28 22:19:21