我有2个名单。
它们的长度不同但类型相同。
我希望List2中的Item替换List1中的相同项。
$location.hash(scrollto);
$anchorScroll();
因此,我希望列表包含5个项目,其中Id = 1的项目具有值" NewValue"。
我怎样才能用linq做到这一点。
更新
我延伸了我的问题:
如何在不手动复制所有属性的情况下更换替换的项目。想象一下,我有100个属性...
答案 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();
请注意我如何将IdBasedItemEqualityComparer
与Except
方法结合使用,以便比较仅基于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();