C# 合并具有多个列表但长度不同的相等项
我有两张清单 它们的长度不同,但类型相同 我希望列表2中的一个项替换列表1中的一个相等项C# 合并具有多个列表但长度不同的相等项,c#,linq,C#,Linq,我有两张清单 它们的长度不同,但类型相同 我希望列表2中的一个项替换列表1中的一个相等项 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
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" } };
var item1=newitem{Id=1,Name=“Test1”};
var item2=新项{Id=2,Name=“Test2”};
var item3=新项{Id=3,Name=“Test3”};
var item4=新项{Id=4,Name=“Test4”};
var item5=新项{Id=5,Name=“Test5”};
var list1=新列表{item1,item2,item3,item4,item5};
var list2=新列表{new Item{Id=1,Name=“NewValue”};
因此,我希望列表中有5个项,其中Id=1的项的值为“NewValue”
我怎样才能在linq身上做到这一点
更新
我的问题是:
如何在不手动复制所有属性的情况下替换替换的项。想象一下我有100个属性…这是一种方法: 首先定义一个仅依赖于
项
类的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();
}
}
var result = list1.Except(list2, new IdBasedItemEqualityComparer()).Concat(list2).ToList();
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();
请注意,我是如何将
IDBasedItemQualityComparer
与Exception
方法一起使用的,这样比较就只基于Id
这是一种解决方案
var list3 = new List<Item>();
foreach (var item in list1)
list3.Add(list2.FirstOrDefault(s => s.Id == item.Id) ?? item);
var list3=新列表();
foreach(列表1中的变量项)
list3.Add(list2.FirstOrDefault(s=>s.Id==item.Id)??item);
我认为Linq中的LEFT-OUTER-JOIN将能够合并两个列表,而不考虑属性(列)的数量,如下所示:
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();
}
}
var result = list1.Except(list2, new IdBasedItemEqualityComparer()).Concat(list2).ToList();
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();
列出新项目=
(来自列表1中的l1)
将l1.Id等于l2.Id的列表2中的l2连接到l12
从l12.DefaultIfEmpty()中的l2
选择新的{Item=(l2==null)?l1:l2});
在谷歌上搜索,你会看到大量的结果/示例。这里有一个给你。。我更新了我的问题。我用过谷歌,但我找不到你的链接-这对我只有部分帮助-你说你找不到这个链接是什么意思?就在这里,你需要原始列表中的任何属性值吗?我的意思是我没有在谷歌中找到你的链接。这意味着谷歌搜索结果取决于你使用的关键词。好的,你先做一个RemovedUpplicateItems,然后添加所有项目。