[英]use LINQ to remove items from a list based on a date
在C#中我有一個列表locationsList
,其中包含字段location
和date
, location
可以多次出現,具有不同的日期。
如果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.