using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
Dictionary<int, int> dic1 = new Dictionary<int, int>() { {24379,349}, { 24368, 348 }, { 24377, 91 }, { 24366, 90 } };
Dictionary<int, int> dic2 = new Dictionary<int, int>() { { 24379, 270451 }, { 24368, 270451 }, { 24377, 270450 }, { 24366, 270450 } };
var a = OpAdd(dic1, dic2);
var b = AnsAdd(dic1, dic2);
Console.WriteLine("OP's results");
Show(a);
Console.WriteLine("Answer's answer");
Show(b);
}
private static Dictionary<int, int> OpAdd(Dictionary<int, int> dict1, Dictionary<int, int> dict2) {
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.ContainsKey(itemKey)
&& dict2[a.Key] == dict2[itemKey])
.Sum(a => a.Value)
);
}
return result;
}
private static Dictionary<int, int> AnsAdd(Dictionary<int, int> dict1, Dictionary<int, int> dict2)
{
var lookup = dict1
.Where(p => dict2.ContainsKey(p.Key))
.GroupBy(p => dict2[p.Key])
.ToDictionary(g => g.Key, g => g.Sum(p => p.Value));
return dict1.Keys
.Where(k => dict2.ContainsKey(k))
.ToDictionary(k => k, k => lookup[dict2[k]]);
}
private static void Show(IDictionary<int,int> d) {
foreach(var p in d.OrderBy(x => x.Key)) {
Console.WriteLine("{0} : {1}", p.Key, p.Value);
}
Console.WriteLine("-----------");
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICAgRGljdGlvbmFyeTxpbnQsIGludD4gZGljMSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpIHsgezI0Mzc5LDM0OX0sIHsgMjQzNjgsIDM0OCB9LCB7IDI0Mzc3LCA5MSB9LCB7IDI0MzY2LCA5MCB9IH07CiAgICAJRGljdGlvbmFyeTxpbnQsIGludD4gZGljMiA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpIHsgeyAyNDM3OSwgMjcwNDUxIH0sIHsgMjQzNjgsIDI3MDQ1MSB9LCB7IDI0Mzc3LCAyNzA0NTAgfSwgeyAyNDM2NiwgMjcwNDUwIH0gfTsKICAgIAl2YXIgYSA9IE9wQWRkKGRpYzEsIGRpYzIpOwogICAgCXZhciBiID0gQW5zQWRkKGRpYzEsIGRpYzIpOwogICAgCUNvbnNvbGUuV3JpdGVMaW5lKCJPUCdzIHJlc3VsdHMiKTsKCQlTaG93KGEpOwogICAgCUNvbnNvbGUuV3JpdGVMaW5lKCJBbnN3ZXIncyBhbnN3ZXIiKTsKCQlTaG93KGIpOwoJfQoJcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeTxpbnQsIGludD4gT3BBZGQoRGljdGlvbmFyeTxpbnQsIGludD4gZGljdDEsIERpY3Rpb25hcnk8aW50LCBpbnQ+IGRpY3QyKSB7CgkJRGljdGlvbmFyeTxpbnQsIGludD4gcmVzdWx0ID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CgkJZm9yZWFjaCAoaW50IGl0ZW1LZXkgaW4gZGljdDEuS2V5cykKCQl7CiAgICAJCXJlc3VsdC5BZGQgKAogICAgCQkJaXRlbUtleQogICAgCQksICAgZGljdDEuV2hlcmUoYSA9PiBkaWN0Mi5Db250YWluc0tleShhLktleSkgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpY3QyLkNvbnRhaW5zS2V5KGl0ZW1LZXkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkaWN0MlthLktleV0gPT0gZGljdDJbaXRlbUtleV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TdW0oYSA9PiBhLlZhbHVlKQogICAgICAgICAgICApOwoJCX0KCQlyZXR1cm4gcmVzdWx0OwoJfQoJCglwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5PGludCwgaW50PiBBbnNBZGQoRGljdGlvbmFyeTxpbnQsIGludD4gZGljdDEsIERpY3Rpb25hcnk8aW50LCBpbnQ+IGRpY3QyKQogICAgewogICAgICAgIHZhciBsb29rdXAgPSBkaWN0MQogICAgICAgICAgICAuV2hlcmUocCA9PiBkaWN0Mi5Db250YWluc0tleShwLktleSkpCiAgICAgICAgICAgIC5Hcm91cEJ5KHAgPT4gZGljdDJbcC5LZXldKQogICAgICAgICAgICAuVG9EaWN0aW9uYXJ5KGcgPT4gZy5LZXksIGcgPT4gZy5TdW0ocCA9PiBwLlZhbHVlKSk7CiAgICAgICAgcmV0dXJuIGRpY3QxLktleXMKICAgICAgICAgICAgLldoZXJlKGsgPT4gZGljdDIuQ29udGFpbnNLZXkoaykpCiAgICAgICAgICAgIC5Ub0RpY3Rpb25hcnkoayA9PiBrLCBrID0+IGxvb2t1cFtkaWN0MltrXV0pOwogICAgfQogICAgCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNob3coSURpY3Rpb25hcnk8aW50LGludD4gZCkgewogICAgCWZvcmVhY2godmFyIHAgaW4gZC5PcmRlckJ5KHggPT4geC5LZXkpKSB7CiAgICAJCUNvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gOiB7MX0iLCBwLktleSwgcC5WYWx1ZSk7CiAgICAJfQogICAgCUNvbnNvbGUuV3JpdGVMaW5lKCItLS0tLS0tLS0tLSIpOwogICAgfQp9