C#合并2个词典并在它们之间添加值

时间:2011-10-03 06:55:42

标签: c# dictionary

我正在学习C#并需要合并两个词典,所以我可以添加两者中的值。

第一个字典是payePlusNssf,它包含每个键的值(键代表员工ID)。到目前为止,我有员工1,2,3,4和5

Dictionary<int, decimal> payePlusNssf = new Dictionary<int, decimal>();

paye.ToList().ForEach(x =>
{
    var deductNSSF = x.Value + nssfAmount;

    payePlusNssf.Add(x.Key, deductNSSF);
});

第二个字典是nhifRatesDictionary,它保存要添加到第一个字典中每个员工的每个值的费率。

Dictionary<int, IEnumerable<NHIFRates>> nhifRatesDictionary =
   new Dictionary<int, IEnumerable<NHIFRates>>();

basicPayDictionary.ToList().ForEach(x =>
{
    List<NHIFRates> nhifValueList = new List<NHIFRates>();

    // Using Employee basic pay
    decimal basicPay = x.Value;

    bool foundflag = false;

    foreach (var item in nhifBracketList)
    {
        if (basicPay >= item.Min && basicPay <= item.Max)
        {
            nhifValueList.Add(new NHIFRates { Rate = item.Rate });

            foundflag = true;
            break;
        }                       
    }

    if (!foundflag)
    {
        nhifValueList.Add(new NHIFRates { Rate = 0m });
    }

    nhifRatesDictionary.Add(x.Key, nhifValueList);
});

struct NHIFRates
{
    public decimal Rate { get; set; }
}

总之,我在合并和添加后需要这个:

Dict 1          Dict 2          Result Dict 3
key  value      key  rate       key  value
1     500       1     80        1    580
2    1000       2     100       2   1100
3    2000       3     220       3   2220
4     800       4     300       4   1100
5    1000       5     100       5   1100

我如何实现这一目标?我查看过这个网站上过去的类似问题,但对我没有太大帮助。

2 个答案:

答案 0 :(得分:3)

未经测试但请尝试:

payePlusNssf.ToDictionary(
            v => v.Key, 
            v => v.Value + nhifRatesDictionary[v.Key].Sum(nhifr => nhifr.Rate)
                         );

这假定由于nhifRatesDictionary的值是IEnumreable,因此您希望对可枚举中的所有值求和。如果IEnumerable为空,这也应该有效。如果您知道每个键只有一个值,那么您可以使用:

payePlusNssf.ToDictionary(
            v => v.Key, 
            v => v.Value + nhifRatesDictionary[v.Key].Single(nhifr => nhifr.Rate)
                         );

答案 1 :(得分:1)

简单的循环怎么样?

Dictionary<int,decimal> d3 = new Dictionary<int,decimal>();
for (int i = 1,i<=payePlusNssf.Count,i++)
{
    d3.Add (i,payePlusNssf[i]+((nhifRatesDictionary[i])[0]).Rate);
}

如果不保证身份证号码如此简单,您可以使用

foreach (var x in payePlusNssf)
{
    d3.Add(x.Key,x.Value+ ((nhifRatesDictionary[x.Key])[0]).Rate);
}

或者完全不同,不要保留三个单独的字典,这些字典保证具有相同的密钥并创建像

这样的员工类
class Employee
{
    public decimal payePlusNssf;
    public decimal nhifRate;
    public decimal Sum
    {
        get { return payePlusNssf + nhifRate ;}
    }
}

并且有一个包含所有内容的词典 - 为您保存字典全部更新的问题。