Raj
Raj

Reputation: 33

How to join two dictionaries?

I have two dictionaries. If the values in dict2 are same then we have to add the values for the matching keys from dict1 and generate a result in the result dictionary as given below.

**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

I have the following logic and would like to optimize this solution:

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);
}

Upvotes: 3

Views: 718

Answers (3)

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726599

You can do it in two steps:

  • Prepare a dictionary for looking up the value by dict2's value
  • Walk through dict1, and insert values from the look-up dictionary

Here is how you can do it:

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.

Upvotes: 3

paparazzo
paparazzo

Reputation: 45096

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;
}

question is not clear

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;
}

Upvotes: 1

Bruno Saboia
Bruno Saboia

Reputation: 352

Perhaps it's easier to do like this, if you are not sure that dict1 and dict2 will have the same keys:

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;
    }
}

This will only add values present in both dictionaries. If your Dictionary is very big, you could perhaps use a Parallel For, or consider use Hashtable instead.

Upvotes: 0

Related Questions