使用LINQ选择最新的,不同的项目

时间:2017-06-21 09:58:16

标签: c# linq

我有一个对象列表,每个对象看起来像这样:

public class Item
{
    public string Id { get; set; }
    public DateTime Timestamp { get; set; }
    public string Status { get; set; }
}

在我的列表中,相同的 ID 可能会重复显示,但具有不同的时间戳和状态值。因此,示例列表(以JSON表示法)可能如下所示:

[
  {
    "Id": "123",
    "Timestamp": "2017-06-21T08:00:00.000Z",
    "Status": "Ordered"
  },
  {
    "Id": "789",
    "Timestamp": "2017-06-20T09:00:00.000Z",
    "Status": "Ordered"
  },
  {
    "Id": "123",
    "Timestamp": "2017-06-20T10:00:00.000Z",
    "Status": "Dispatched"
  },
]

请注意,项目“123”出现两次 - 在上午8点订购,上午10点发送。

有没有办法使用LINQ从该列表中删除重复项(通过Id),因此我们只留下每个Id的最新项目(按时间戳)?换句话说,我只想要一个包含每个项目的最新状态的列表:

[
  {
    "Id": "789",
    "Timestamp": "2017-06-20T09:00:00.000Z",
    "Status": "Ordered"
  },
  {
    "Id": "123",
    "Timestamp": "2017-06-20T10:00:00.000Z",
    "Status": "Dispatched"
  },
]

1 个答案:

答案 0 :(得分:5)

GroupBy尝试Id并按TimeStamp对每个群组进行排序:

IEnumerable<Item> source = ...

var result = source
  .GroupBy(item => item.Id)
  .Select(chunk => chunk
     .OrderByDescending(item => item.TimeStamp)
     .First())
  .ToArray(); // if you want materialization