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

本文关键字:字典 之间 两个 linq 使用 | 更新日期: 2023-09-27 18:20:22

今天早上我一直在和linq玩,有一个关于比较两个字典的问题。我想比较两个骰子并返回差值。我能够通过在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

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

根据您的要求,这是一个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,那么您应该没有问题。