合并具有多个列表但长度不同的相同项目

时间:2015-10-10 22:16:05

标签: c# linq

我有2个名单。

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

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

$location.hash(scrollto);
$anchorScroll();

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

我怎样才能用linq做到这一点。

更新

我延伸了我的问题:

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

3 个答案:

答案 0 :(得分:3)

这是一种方法:

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

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();
    }
}

然后,您可以使用list1方法获取list2中没有相应项目的项Except,然后您可以使用{{list2将其连接到Concat 1}}这样的方法:

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

请注意我如何将IdBasedItemEqualityComparerExcept方法结合使用,以便比较仅基于Id

答案 1 :(得分:1)

脱离我的头脑这是一个解决方案

var list3 = new List<Item>();    

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

答案 2 :(得分:1)

我认为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();