【问题标题】:How to remove two objects with the same ID but different date values with LINQ to objects如何使用 LINQ to 对象删除具有相同 ID 但日期值不同的两个对象
【发布时间】:2013-05-25 07:11:07
【问题描述】:

我有一个List<dynamic>,其中有 N 条 ID 相同但 ValidTo/ValidFrom 值不同的记录。

假设我有这些物品:

Id: 1, ValidFrom: 1/1/2012, ValidTo: 1/1/2015
Id: 1, ValidFrom: 1/1/2013, ValidTo: 1/1/2015.
Id: 2, ValidFrom: 6/1/2012, ValidTo: 1/1/2015
Id: 2, ValidFrom: 6/1/2013, ValidTo: 1/1/2015
Id: 3, ValidFrom: 12/1/2012, ValidTo: 1/1/2015
Id: 3, ValidFrom: 12/1/2013, ValidTo: 1/1/2015

鉴于此,我想从当前集合中删除旧记录(对于每个 ID,ValidFrom 日期最低的那个),或者只获取一个包含每个 ID 的新集合,但是ValidFrom 日期最长的那些。

所以,预期的输出是:

Id: 1, ValidFrom: 1/1/2013, ValidTo: 1/1/2015.
Id: 2, ValidFrom: 6/1/2012, ValidTo: 1/1/2015
Id: 3, ValidFrom: 12/1/2013, ValidTo: 1/1/2015

也就是说,在 ID 为 1 的两条记录中,ValidFrom 最低的一条被丢弃,对于 ID2 和 ID3,依此类推。

我认为这将通过分组来完成,我只是不确定如何。

感谢您的帮助。

【问题讨论】:

  • 请给我们该列表的预期输出?
  • 您不能使用 LINQ 删除,只能不返回这些值。
  • @bash.d 公平地说,这只是一个技术细节。
  • 技术细节?它对 LINQ 的本质至关重要!
  • @newStackExchangeInstance 预期的输出是:

标签: c# linq linq-to-objects


【解决方案1】:
list.GroupBy(x => x.Id)
    .Select(group => 
            group.OrderByDescending(record => record.ValidFrom).First())

这个答案来自记忆,我没有方便的编译器来检查它。

我假设日期实际上是 DateTime 对象。如果它们只是字符串,则需要更改逻辑以解决此问题。

【讨论】:

  • 那你脑子里就有了一个编译器。那是确切的语法,它工作得很好。谢谢!
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2018-12-07
  • 2017-11-09
相关资源
最近更新 更多