Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ根据日期从列表中删除项目_C#_List_Linq - Fatal编程技术网

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

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

在C#中,我有一个列表
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);
     })