我有一个包含多个属性的对象列表。这是对象。
public class DataPoint
{
private readonly string uniqueId;
public DataPoint(string uid)
{
this.uniqueId = uid;
}
public string UniqueId
{
get
{
return this.uniqueId;
}
}
public string ScannerID { get; set; }
public DateTime ScanDate { get; set; }
}
现在在我的代码中,我有一个巨大的列表,数百甚至几千。
每个数据点对象属于某种类型的扫描仪,并具有扫描日期。我想删除在同一天扫描的任何数据点,除了给定机器的最后一个数据点。
我尝试使用LINQ如下,但这不起作用。我仍有许多重复的数据点。
this.allData = this.allData.GroupBy(g => g.ScannerID)
.Select(s => s.OrderByDescending(o => o.ScanDate))
.First()
.ToList();`
我需要按扫描仪ID对数据点进行分组,因为可能会在同一天但在不同的计算机上扫描数据点。如果有多个,我只需要一天的最后一个数据点。
编辑以澄清 - 最后一个数据点是指给定机器的给定扫描日期的最后扫描数据点。我希望有所帮助。因此,当按扫描仪ID进行分组时,我尝试按扫描日期进行排序,然后仅将上次扫描日期保留多天扫描日期。
以下是2台机器的一些测试数据:
Unique ID Scanner ID Scan Date
A1JN221169H07 49374 2003-02-21 15:12:53.000
A1JN22116BK08 49374 2003-02-21 15:14:08.000
A1JN22116DN09 49374 2003-02-21 15:15:23.000
A1JN22116FP0A 49374 2003-02-21 15:16:37.000
A1JOA050U900J 80354 2004-10-05 10:53:24.000
A1JOA050UB30K 80354 2004-10-05 10:54:39.000
A1JOA050UD60L 80354 2004-10-05 10:55:54.000
A1JOA050UF80M 80354 2004-10-05 10:57:08.000
A1JOA0600O202 80354 2004-10-06 08:38:26.000
答案 0 :(得分:5)
我想删除在同一天扫描的所有数据点,除了最后一个对于给定的计算机。
因此,我假设您要按ScanDate
和ScannerID
进行分组。这是代码:
var result = dataPoints.GroupBy(i => new { i.ScanDate.Date, i.ScannerID })
.OrderByDescending(i => i.Key.Date)
.Select(i => i.First())
.ToList();
答案 1 :(得分:1)
如果我理解正确,这就是你想要的。
var result = dataPoints.GroupBy(i => new { i.ScanDate.Date, i.ScannerID })
.Select(i => i.OrderBy(x => x.ScanDate).Last())
.ToList();
这个按扫描仪ID和日期分组(SacnnerDate.Date
会将时间部分清零),然后对于每个分组,它按ScanDate
排序(因为这些组是同一天,这将订购在时间上)并采取最后的。因此,对于每一天,您将获得每个扫描仪的一个结果,该扫描仪具有该特定日期的最新ScanDate
。
答案 2 :(得分:-1)
除此之外,该课程可以定义为
public class DataPoint
{
public DataPoint(string uid)
{
UniqueId = uid;
}
public string UniqueId {get; private set; }
public string ScannerID { get; set; }
public DateTime ScanDate { get; set; }
}