C # Объединение 2 словарей и добавление значений между ними - PullRequest
2 голосов
/ 03 октября 2011

Я изучаю C # и мне нужно объединить два словаря, чтобы я мог добавить значения, найденные в обоих.

Первый словарь - payePlusNssf, который содержит значение для каждого ключа (ключ представляет собой идентификатор сотрудника). Пока что у меня есть сотрудники 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);
});

2-й словарь - 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 ]

3 голосов
/ 03 октября 2011

Не проверено, но попробуйте:

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 голос
/ 03 октября 2011

А как насчет простого цикла?

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

, и один словарь со всем - избавит вас от проблем с обновлением всех словарей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...