【问题标题】:Linq to select objects from two lists based on contentLinq 根据内容从两个列表中选择对象
【发布时间】:2017-09-07 19:42:55
【问题描述】:

我有两个包含对象的列表。它们的长度相同。每个对象都有一个 ID(在两个列表中都有表示)、一个更改日期和一些数据。我想使用有效的 Linq 语句创建一个具有相同 ID 但具有更新日期的对象的新列表。

例子:

清单 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

干杯

【问题讨论】:

  • 两个列表的顺序一样吗?​​
  • 顺序并不总是一样的。

标签: c# linq


【解决方案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());

【讨论】:

  • 优秀而优雅。谢谢!
  • 您可以将input.SelectMany(x =&gt; x) 替换为list1.Union(list2),而不是将两者都放在额外的输入列表中。
  • @Jeremi 更好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多