如何删除列表中具有相同字符串但起始日期较低的元素

时间:2019-06-07 09:52:18

标签: c# linq

如何在列表中删除具有相同字符串但startDate.Time较低的元素?

假设您有一个看起来像这样的列表:

Datetime Date        String Name
07.06.2019 10:16:00, Test 
07.06.2019 11:16:00, Test 
07.06.2019 12:16:00, Test 
07.06.2019 13:16:00, Test 
07.06.2019 18:16:00, Test1 
07.06.2019 19:16:00, Test1 
07.06.2019 20:16:00, Test1 
07.06.2019 21:16:00, Test1 
07.06.2019 22:16:00, Test2 
07.06.2019 23:16:00, Test2

鉴于DateTime.Date是相同的,我只想保留列表中每个字符串具有最新时间戳的DateTime.Date

我该如何实现?

我的实现:

List.OrderByDescending(x => x.Datetime).GroupBy(x => 
x.Datetime.Date).Select(x => x.First()).ToList();

但是,这并不认为字符串应该不同,就好像Test和test1具有相同的Datetime.Date值一样,但是Test字符串具有更高的时间戳,则它将删除Test1元素,而不是希望的。

3 个答案:

答案 0 :(得分:1)

您可以通过使用Max来做到这一点;

var result = List.GroupBy(x => x.Name)
                .Select(i => new MyList { Name = i.Key, DateTime = i.Max(j => j.DateTime).Date })
                .ToList();

答案 1 :(得分:1)

假设具有DateTime和字符串属性的类如下所示:

public class MyClass
{
    public string Text { get; set; }
    public DateTime Date { get; set; }
}

然后您可以使用的LINQ是这样的:

var newList = List.GroupBy(l => l.Text).Select(g => new MyClass { Text = g.Key, Date = g.Max(i => i.Date)}).ToList();

这将根据您的要求为您提供过滤列表。

答案 2 :(得分:1)

由于您说过要获取每个Name的每个日期的最新信息,所以我建议:

var ans = list.GroupBy(i => new { i.Date.Date, i.Name }).Select(ig => ig.OrderByDescending(i => i.Date.TimeOfDay).First()).ToList();