在C#中,我有一个列表locationsList
,其中包含字段location
和date
,
location
可以多次显示不同的日期。
如果location
多次出现,我想只保留最新日期。
是否有任何方法可以使用LINQ而不是遍历列表并比较每个多个位置的日期?
答案 0 :(得分:3)
我假设字段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);
})