C# 使用LINQ根据日期从列表中删除项目
在C#中,我有一个列表C# 使用LINQ根据日期从列表中删除项目,c#,list,linq,C#,List,Linq,在C#中,我有一个列表locationsList,其中包含location和date字段, 位置可以在不同日期出现多次 如果location出现多次,我只想保留最新日期的一个。 有没有办法使用LINQ来完成此操作,而不是遍历列表并比较每个多个发生位置的日期?我假设字段位置是一个字符串,您可以重建位置对象: class Location { public string location { get; set; } public DateTime date { get; set; }
locationsList
,其中包含location
和date
字段,
位置
可以在不同日期出现多次
如果location
出现多次,我只想保留最新日期的一个。
有没有办法使用LINQ来完成此操作,而不是遍历列表并比较每个多个发生位置的日期?我假设字段
位置
是一个字符串,您可以重建位置对象:
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方法的非通用版本:
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 ;
}
请提供您当前代码的详细信息。正如dymanoid提到的,如果没有代码示例,我们无法真正回答此问题。根据对您很重要的字段对数据进行分组。也可以不使用MoreLINQ进行分组:
Select(group=>group.First(x=>x.Date==group.Max(y=>y.Date))
。更详细一点,但可能。(请注意,我使用了First
而不是FirstOrDefault
,因为在GroupBy
之后在逻辑上永远不会遇到null)@更平坦的是,这将为原始源中的每个项目计算组上的Max
。这将有糟糕的性能。如果您想走这条路线,请在首先调用之前计算最大值。
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 ;
}
var distincts = locationsList
.GroupBy(location => location.location)
.Select(grp => {
var maxDate = grp.Max(location => location.date);
return grp.First(location => location.date == maxDate);
})