Linq根据内容从两个列表中选择对象

时间:2017-09-07 19:42:56

标签: 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

清单2:

ID: 1 ChangeDate 12:05 Data 2:1 <-
ID: 2 ChangeDate 12:55 Data 2:2
ID: 3 ChangeDate 14:10 Data 2:3 <-

结果:

ID: 1 ChangeDate 12:05 Data 2:1 
ID: 2 ChangeDate 13:00 Data 1:2
ID: 3 ChangeDate 14:10 Data 2:3

干杯

1 个答案:

答案 0 :(得分:1)

如果我们假设您有一个包含您提到的列表的列表:

var input = new List<Item> { list1, list2 };

其中Itemlist1list2包含的对象的类型。

您可以尝试以下操作:

var output = input.SelectMany(x=>x)
                  .GroupBy(x=>x.ID)
                  .Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First());

基本上,我们将列表中的所有元素放在一个列表中,然后根据其ID对项目进行分组。然后从每组我们选择最近的记录。

如果我们只有列表,我们可以将它们连接起来:

var input = list1.AddRange(list2);

然后尝试以下操作:

var output = input.GroupBy(x=>x.ID)
                  .Select(gr=>gr.OrderByDescending(x=>x.ChangeDate).First());