2017-01-01 74 views
2

我有兩本字典。如果dict2中的值相同,那麼我們必須添加來自dict1的匹配鍵的值,並在結果字典中生成一個結果,如下所示。如何加入兩個字典?

**dict1**       **dict2** 
Id   value      Id   value 
24379  348       24379  270451 
24368  348       24368  270451 
24377  90       24377  270450 
24366  90       24366  270450 
24369  10       24369  270450 
24300  25 

Result: 
24379  696 
24368  696 
24377  190 
24366  190 
24369  190 

我有以下的邏輯,並希望優化此解決方案:

Dictionary<int, int> result = new Dictionary<int, int>(); 

foreach (int itemKey in dict1.keys) 
{ 
    result.add (itemKey, dict1.Where(a => dict2.ContainsKey(a.key) 
             && dict2.ContiansKey(itemKey) 
             && dict2[a.key] == dict2[itemKey]) 
           .Sum(a => a.value); 
} 
+0

*接下來我們要添加值從dict1匹配的鑰匙*。我不明白你期望的結果。看起來你正在乘以兩倍,而不是一起加入。 –

+1

@PatrickHofman'24379'和'24368'的'dict2'值都是'270451',所以OP將從'dict1'加起來,這兩個值恰好都是'348'。 – dasblinkenlight

+1

是什麼樣的設計!它真的搞砸了@dasblinkenlight –

回答

2

可以在兩個步驟做:

  • 準備字典通過查找值dict2的值
  • 步行通過dict1,並從查找字典中插入值

這裏是你如何能做到這一點:

var lookup = dict1 
    .Where(p => dict2.ContainsKey(p.Key)) 
    .GroupBy(p => dict2[p.Key]) 
    .ToDictionary(g => g.Key, g => g.Sum(p => p.Value)); 
var res = dict1.Keys 
     .Where(k => dict2.ContainsKey(k)) 
     .ToDictionary(k => k, k => lookup[dict2[k]]); 

Demo.

0

也許是更容易做這樣的,如果你不能確定dict1dict2將具有相同的鍵:

var result = new Dictionary<int, int>(); 

foreach(var kvp in dict1) 
{ 
    int value; 

    if(dict2.TryGetValue(kvp.Key, out value)) 
    { 
     result[kvp.Key] = kvp.Value * 2; 
    } 
} 

這隻會增加兩個字典中的值。如果您的字典非常大,則可以使用Parallel For,或者考慮使用Hashtable

+0

無法修改枚舉中的集合 – Paparazzi

1
public static void DicAddTest() 
{ 
    Dictionary<int, int> dic1 = new Dictionary<int, int>() { {24379,348}, { 24368, 348 }, { 24377, 90 }, { 24366, 90 } }; 
    Dictionary<int, int> dic2 = new Dictionary<int, int>() { { 24379, 270451 }, { 24368, 270451 }, { 24377, 270450 }, { 24366, 270450 } }; 
    Dictionary<int, int> dicResult = DicAdd(dic1, dic2); 
    foreach (KeyValuePair<int, int> kvp in dicResult) 
     Debug.WriteLine("{0} {1}", kvp.Key, kvp.Value); 
    Debug.WriteLine(""); 
} 
public static Dictionary<int, int> DicAdd(Dictionary<int, int> dic1, Dictionary<int, int> dic2) 
{ 
    Dictionary<int, int> dicResult = new Dictionary<int, int>(dic1); 
    foreach (int k in dic1.Keys.Where(x => dic2.Keys.Contains(x))) 
     dicResult[k] = dicResult[k] + dicResult[k]; 
    return dicResult; 
} 

問題不明確

public static Dictionary<int, int> DicAdd2(Dictionary<int, int> dic1, Dictionary<int, int> dic2) 
{ 
    Dictionary<int, int> dicResult = new Dictionary<int, int>(); 
    foreach (KeyValuePair<int, int> kvp in dic1.Where(x => dic2.Keys.Contains(x.Key))) 
     dicResult.Add(kvp.Key, 2 * kvp.Value); 
    return dicResult; 
} 
+1

這兩個代碼都不會產生與問題代碼相同的結果。請用'dic1 =新詞典(){{24379,1},{24368,10},{24377,100},{24366,1000}};'檢查它。問題的結果是「{{24379,11},{24368,11},{24377,1100},{24366,1100}}',你的是{{24379,2},{24368,20}, {24377,200},{24366,2000}}'。 –

+1

我完全理解OP爲什麼接受這個。問題的英文部分可能不明確,但C#部分對於OP所需要的內容毫無疑問。您的代碼會忽略'dic2'的值,而不是'dic1'中的值。這是不正確的,並且當您稍微更改數字時會生成與OP代碼不同的答案([demo](http://ideone.com/p1tS41))。 – dasblinkenlight

+0

如果問題不清楚,我們可以投票結束*不清楚您要提問的問題*或發表評論。接受這個作爲答案讓我覺得,這個問題是不明確的OP太:O) –