我有一个对象列表,每个对象看起来像这样:
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"
},
]
答案 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