2011-10-03 98 views
2

我學習C#和合並兩個字典,所以我可以加入都發現價值所需要的。C#合併2個字典和它們之間增加值

第一詞典是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 

如何實現這一目標?我已經查看了過去在這個網站上遇到的類似問題,但對我沒有太大的幫助。

+0

你的意思是你希望從第一詞典和第二詞典爲每個員工所有的利率增加價值?是否保證第一本字典中的每個員工都在第二個字典中? – svick

+1

我一定需要caffine。我有點困惑你的代碼。你爲什麼要爲此使用字典? OK,那麼,你的第二個字典,可能已被簡化爲一個字典,如果你與合作,FOREACH第一字典,查找值,如果在第二,做工作,添加項目到新的字典,否則只需添加它作爲不需要更改 – BugFinder

+0

@svick第一本詞典中的每位員工都將處於第二位,即完美匹配。我需要將dict2中計算的每個費率添加到dict1中的相應值 –

回答

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) 
         ); 
+0

謝謝。這有助於 –

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

如果ID號不存在保證是這個簡單,你可以使用

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

,並有一個解釋一切僱員類 - 保存你保持所有更新的字典問題。

+0

的'nhifRatesDictionary'是'IEnumerable的'沒有直接'Rate'屬性值的值。 – Variant

+0

字典中的關鍵字是一個id。你不能指望他們是連續的。如果他們不是,你的代碼將無法工作。 – svick

+0

@svick這就是foreach版本的來源。 – Lukas