使用linq的两个词典之间的差异

时间:2012-01-16 17:17:03

标签: c# linq

我今天早上一直在玩linq并且对比较两个词典有疑问。我想比较两个dicionarys并返回差异。我可以通过在foreach循环中最小化查询来生成我想要的输出。但是,我想知道是否有一个运算符可以让我更简化这一点。下面我列出了我想简化的代码。

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

您可能需要注意如何存储缺少的项目,如果您在没有库存时删除值,那么您将不会打印出库存减少。但是,如果您存储0,那么您应该没有问题。