2012-01-16 56 views
0

今天早上我一直在玩linq,並且有一個關於比較兩個詞典的問題。我想比較兩個dicionarys並返回差異。通過在我的foreach循環中minuplating查詢,我能夠產生我想要的輸出。但是,我想知道是否有運營商可以讓我更簡化一點。下面我列出了我想要簡化的代碼。使用linq的兩個詞典之間的區別

var _ItemsBefore = new SortedDictionary<int, int>() { { 1, 12 }, { 2, 12 } }; 
var _ItemsAfter = new SortedDictionary<int, int>() { { 1, 11 }, { 2, 8 } { 3, 1 } }; 

foreach(var item in _ItemsAfter.Except(_ItemsBefore)) 
{ 
    if(_ItemBefore.ContainsKey(item.Key)) 
    Console.WriteLine(string.format("{0} {1}", item.Key, _ItemsAfter[item.Key] -_ItemsBefore[item.Key])); 
    else 
    Console.WriteLine(string.format("{0} {1}", item.Key, item.Value) 
} 

results 
1 -1 
2 -4 
3 1 
+1

如果第一本字典中有{5,10}您的輸出結果是什麼? – 2012-01-16 18:09:15

+0

這將是相同的結果。我只對改變了什麼感興趣。你從庫存的角度來看待這個問題。之前是所有的項目在一天開始,後是項目在結束。您可能在白天已售出物品或收到物品。我對我賣出的東西和我收到的東西感興趣?我希望我明白這一點。 – poco 2012-01-16 18:24:53

回答

2

通過你的要求,這是一個LINQ版本,但它並不像你for循環的版本爲可讀:

var result = _ItemsAfter 
      .Except(_ItemsBefore) 
      .Select(x => _ItemsBefore.ContainsKey(x.Key) ? 
        new KeyValuePair<int, int>(x.Key, x.Value - _ItemsBefore[x.Key]) : 
        new KeyValuePair<int, int>(x.Key, x.Value)).ToList(); 
+0

謝謝Saeed,我想這是一個簡單的格式。我會堅持我的foreach循環可讀性。 – poco 2012-01-16 18:32:58

0

你可能要小心你如何存儲缺乏的項目,如果您在沒有庫存時刪除值,則不會打印出庫存中的減少量。但是,如果你存儲0,那麼你應該沒有問題。

+0

這將永遠不會是這種情況先生。我上面提到的項目的例子只是爲了澄清我之後的事情。 Before and After只是特定時間的字典快照。不添加或刪除,只是比較。 – poco 2012-01-16 18:51:36

+0

@poco:啊,只要確保數據在Before,但不在After中包含在結果中的事實是合適的。 – Guvante 2012-01-17 00:28:32