C# Linq根据内容从两个列表中选择对象
我有两个对象列表。它们的长度相同。每个对象都有一个ID(在两个列表中都表示)、一个更改日期和一些数据。我想创建一个具有相同ID但具有更新日期的对象的新列表,并使用有效的Linq语句 例如: 清单1:C# Linq根据内容从两个列表中选择对象,c#,linq,C#,Linq,我有两个对象列表。它们的长度相同。每个对象都有一个ID(在两个列表中都表示)、一个更改日期和一些数据。我想创建一个具有相同ID但具有更新日期的对象的新列表,并使用有效的Linq语句 例如: 清单1: ID: 1 ChangeDate 12:00 Data 1:1 ID: 2 ChangeDate 13:00 Data 1:2 <- ID: 3 ChangeDate 14:00 Data 1:3 干杯如果我们假设您有一个包含您提到的列表的列表: var input = new List&l
ID: 1 ChangeDate 12:00 Data 1:1
ID: 2 ChangeDate 13:00 Data 1:2 <-
ID: 3 ChangeDate 14:00 Data 1:3
干杯如果我们假设您有一个包含您提到的列表的列表:
var input = new List<Item> { list1, list2 };
本质上,我们将列表中的所有元素投影到一个列表中,然后根据它们的ID对项目进行分组。然后从每个组中选择最新的记录
如果我们只有列表,我们可以将它们连接起来:
var input = list1.AddRange(list2);
然后尝试以下操作:
var output = input.SelectMany(x=>x)
.GroupBy(x=>x.ID)
.Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First());
var output = input.GroupBy(x=>x.ID)
.Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First());
两个列表的顺序是一样的吗?顺序并不总是一样的。非常好而且优雅。非常感谢。您不必将这两种输入都放在额外的输入列表中,只需将
input.SelectMany(x=>x)
替换为list1.Union(list2)
@Jeremi就更好了。非常感谢。
var input = list1.AddRange(list2);
var output = input.GroupBy(x=>x.ID)
.Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First());