如何从另一个字典中减去一个字典?

时间:2019-07-14 23:51:11

标签: c# .net dictionary

我们如何减去两个字典以产生具有差异的第三个字典?

我有字典:Dictionary<string, int>()

+-------+----+
| alex  | 10 |
| liza  | 10 |
| harry | 20 |
+-------+----+

我想从这本词典中减去这本词典:

+-------+---+
| alex  | 5 |
| liza  | 4 |
| harry | 1 |
+-------+---+

我要寻找的结果是:

+-------+----+
| alex  |  5 |
| liza  |  6 |
| harry | 19 |
+-------+----+

我们如何减去两个字典以产生具有差异的第三个字典?

3 个答案:

答案 0 :(得分:5)

  

我们可以假设它们将始终具有相同的键

在这种情况下,使用简单的foreach循环非常容易。完整示例:

var dict1 = new Dictionary<string, int>();
dict1.Add("alex", 10);
dict1.Add("liza", 10);
dict1.Add("harry", 20);

var dict2 = new Dictionary<string, int>();
dict2.Add("alex", 5);
dict2.Add("liza", 4);
dict2.Add("harry", 1);

var dict3 = new Dictionary<string, int>(dict1.Count);   // Thanks, @mjwills!
foreach (var pair in dict1)
{
    dict3.Add(pair.Key, pair.Value - dict2[pair.Key]);
}

或者使用ToDictionary方法而不是循环:

var dict3 = dict1.ToDictionary(p => p.Key, p => p.Value - dict2[p.Key]);

答案 1 :(得分:2)

如果其中一个或两个字典中都有多余的键,则此代码将它们合并在一起:

var dict3 =
    dict1
        .Concat(dict2)
        .Select(x => x.Key)
        .Distinct()
        .Select(x => new
        {
            Key = x,
            Value1 = dict1.TryGetValue(x, out int Value1) ? Value1 : 0,
            Value2 = dict2.TryGetValue(x, out int Value2) ? Value2 : 0,
        })
        .ToDictionary(x => x.Key, x => x.Value1 - x.Value2);

这仍然适用于您的原始字典,但是如果您有此字典:

var dict1 = new Dictionary<string, int>()
{
    { "alex", 10 },
    { "liza", 10 },
    { "harry", 20 },
};

var dict2 = new Dictionary<string, int>()
{
    { "alex", 5 },
    { "liza", 4 },
    { "mike", 1 },
};

然后,它输出如下所示的字典:

new Dictionary<string, int>()
{
    { "alex", 5 },
    { "liza", 6 },
    { "harry", 20 },
    { "mike", -1 },
};

答案 2 :(得分:1)

一个简单的方法是通过简单的foreach循环。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var first = new Dictionary<string, int> { { "alex", 10 }, { "liza", 10 }, { "harry", 20 } };
            var second = new Dictionary<string, int> { { "alex", 5 }, { "liza", 4 }, { "harry", 1 } };
            var third = first.ToDictionary(entry => entry.Key, entry => entry.Value);

            foreach (var item in first)
            {
                third[item.Key] = first[item.Key] - second[item.Key];
                Console.WriteLine(third[item.Key]);
            }

            Console.Read();
        }
    }
}

...或通过linq

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var first = new Dictionary<string, int> { { "alex", 10 }, { "liza", 10 }, { "harry", 20 } };
            var second = new Dictionary<string, int> { { "alex", 5 }, { "liza", 4 }, { "harry", 1 } };
            var third = first.ToDictionary(entry => entry.Key, entry => entry.Value - second[entry.Key]);

            foreach (var item in first)
            {
                Console.WriteLine(third[item.Key]);
            }

            Console.Read();
        }
    }
}