【问题标题】:Finding property differences in two lists在两个列表中查找属性差异
【发布时间】:2016-12-02 19:12:18
【问题描述】:

假设我有两个列表。

我们知道列表中的项目数相同,并且 ID 匹配。

但是,一个或多个属性(ID 除外)可能已更改。在这种情况下,其中两个数量发生了变化:

List1
---------
{
    ItemId: 1
    Quantity: 10
}
{
    ItemId: 2
    Quantity: 12
}
{
    ItemId: 3
    Quantity: 1
}

然后是一个几乎相同的匹配项列表...

List2
---------
{
    ItemId: 1
    Quantity: 10
}
{
    ItemId: 2
    Quantity: 3
}
{
    ItemId: 5
    Quantity: 1
}

除了循环遍历它们并比较 Quantity 属性之外,有没有办法比较两个列表,找到发生更改的 ID,然后仅对更改的项目调用 Update 方法?

换句话说,我只是想避免循环遍历每个列表。

【问题讨论】:

  • 使用GroupBy 查找重复项,然后将其过滤掉?
  • 这里出现的任何解决方案都将在幕后迭代......
  • 好的,这就是我想知道的。所以没有不迭代的内置增量方法。 (叹气)我可能不得不重新考虑这一切。
  • @Eris -- 这可能是最好的解决方案
  • 如果您说List1[i].ItemId == List2[i].ItemId,那么一个循环就足够了,而且易于理解。如果数据来自数据库,也许您可​​以修改用于获取数据的查询。

标签: c# performance linq


【解决方案1】:

使用连接的解决方案 1:

var diffs = List1
  .Join(List2, r2=>r2.ItemId, r1=>r1.ItemId, (r1,r2)=> new { r1, r2 })
  .Where(r=> r.r1.Quantity != l.r2.Quantity);

解决方案 2 使用 except(如果项目具有可比性):

var diffs = List1.Except(List2);

使用MoreLinq的解决方案3:

var diffs = List1.ExceptBy(List2, e=> new {e.ItemId, e.Quantity});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多