【问题标题】:Merge equal items with multiple lists but different length合并具有多个列表但长度不同的相同项目
【发布时间】:2015-10-10 22:16:04
【问题描述】:

我有 2 个列表。

它们的长度不同,但类型相同。

我希望 List2 中的项目替换 List1 中的相同项目。

var item1 = new Item { Id = 1, Name = "Test1" };
var item2 = new Item { Id = 2, Name = "Test2" };
var item3 = new Item { Id = 3, Name = "Test3" };
var item4 = new Item { Id = 4, Name = "Test4" };
var item5 = new Item { Id = 5, Name = "Test5" };

var list1 = new List<Item> { item1, item2, item3, item4, item5 };
var list2 = new List<Item> { new Item { Id = 1, Name = "NewValue" } };

因此,我期望一个包含 5 个项目的列表,其中 Id = 1 的项目具有值“NewValue”。

我怎样才能更好地使用 linq。

更新

我扩展我的问题:

如果不手动复制所有属性,如何替换被替换的项目。想象一下我有 100 个属性...

【问题讨论】:

  • 做一个谷歌搜索,你会看到大量的结果/例子..这里有一个给你..stackoverflow.com/questions/22819619/…
  • 我更新了我的问题。我用谷歌,但我找不到你的链接 - 这只是部分帮助我 -
  • 找不到这个链接是什么意思stackoverflow.com/questions/22819619/…
  • 您需要原始列表中的任何属性值吗?
  • 我的意思是我没有在谷歌中找到你的链接。这意味着 google 结果取决于您使用的关键字。

标签: c# linq


【解决方案1】:

这是一种方法:

首先定义一个仅依赖于Item 类的Id 属性的相等比较器,如下所示:

public class IdBasedItemEqualityComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item obj)
    {
        return obj.Id.GetHashCode();
    }
}

然后,您可以使用 Except 方法获取 list2 中没有对应项目的项目 list1,然后您可以使用 Concat 方法将其与 list2 连接,如下所示:

var result = list1.Except(list2, new IdBasedItemEqualityComparer()).Concat(list2).ToList();

请注意我如何将IdBasedItemEqualityComparerExcept 方法一起使用,因此比较仅基于Id

【讨论】:

  • 好的,你先做一个 RemoveDuplicateItems,然后添加所有项目。
【解决方案2】:

我想这是一种解决方案

var list3 = new List<Item>();    

foreach (var item in list1)   
   list3.Add(list2.FirstOrDefault(s => s.Id == item.Id) ?? item);

【讨论】:

    【解决方案3】:

    我认为 Linq 中的 LEFT OUTER JOIN 将能够合并 2 个列表,而不管属性(列)的数量是多少,如下所示:

        List<Item> newItems =
            (from l1 in list1
             join l2 in list2 on l1.Id equals l2.Id into l12
             from l2 in l12.DefaultIfEmpty()
             select new { Item = (l2 == null) ? l1 : l2 }).Select(r => r.Item).ToList();
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2021-10-21
      • 2017-03-17
      • 2021-05-02
      相关资源
      最近更新 更多