gpt4 book ai didi

c# - 使用 LINQ 根据日期从列表中删除项目

转载 作者:行者123 更新时间:2023-11-30 15:56:44 25 4
gpt4 key购买 nike

在 C# 中,我有一个列表 locationsList,其中包含字段 locationdatelocation 可以在不同的日期出现多次。

如果 location 确实出现了多次,我只想保留最新日期的那个。有没有什么方法可以使用 LINQ 来执行此操作,而不是遍历列表并比较每个多次出现的位置的日期?

最佳答案

我假设字段 location 是一个字符串,您可以重建您的 Location 对象:

class Location {
public string location { get; set; }
public DateTime date { get; set; }
}

var distincts = locationsList
.GroupBy(location => location.location)
.Select(grp => new Location {
location = grp.Key,
date = grp.Max(loc => loc.date)
});

如果重建您的对象不是一个选项,您可以使用 MaxBy MoreLINQ的扩展方法:

var distincts = locationsList 
.GroupBy(location => location.location)
.Select(grp => grp.MaxBy(loc => loc.date))

为简化起见,这里是适用于您的情况的 MaxBy 方法的非通用版本:

Location MaxByDate(List<Location> locations){
Location maxLocation = null;
var maxDate = DateTime.MinValue;
foreach(var location in locations) {
if (location.date > maxDate)
{
maxLocation = location;
maxDate = location.date;
}
}
return maxLocation ;
}

编辑

Flater 提出的另一种选择,性能稍差,因为您必须在每个组中循环两次,一次用于检索 Max,第二个循环用于查找匹配项。但非常可读和可维护。

var distincts = locationsList 
.GroupBy(location => location.location)
.Select(grp => {
var maxDate = grp.Max(location => location.date);
return grp.First(location => location.date == maxDate);
})

关于c# - 使用 LINQ 根据日期从列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com