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

时间:2017-09-14 08:00:43

标签: c# list linq

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

如果location多次出现,我想只保留最新日期。 是否有任何方法可以使用LINQ而不是遍历列表并比较每个多个位置的日期?

1 个答案:

答案 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);
     })