簡體   English   中英

使用LINQ根據日期從列表中刪除項目

[英]use LINQ to remove items from a list based on a date

在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);
     })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM