c# - 计算最快5KM时间
问题描述
我有一台自行车电脑,每秒记录我走了多远
数据的简化版本如下所示:
public class TrackPoint
{
public virtual Guid Id { get; set; } = Guid.NewGuid();
public virtual DateTime Time { get; set; }
public virtual double DistanceMeters { get; set; }
}
var trackPointList = new List<TrackPoint>
{
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:48"), DistanceMeters = 3.8099999427795410},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:49"), DistanceMeters = 7.7600002288818359},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:50"), DistanceMeters = 12.3299999237060547},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:51"), DistanceMeters = 18.0000000000000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:52"), DistanceMeters = 24.8999996185302734},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:53"), DistanceMeters = 32.1599998474121094},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:54"), DistanceMeters = 40.7200012207031250},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:55"), DistanceMeters = 49.7599983215332031},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:57"), DistanceMeters = 68.6100006103515625},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:58"), DistanceMeters = 79.3199996948242188},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:18:00"), DistanceMeters = 100.1900024414062500},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:18:02"), DistanceMeters = 122.7099990844726563},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:18:03"), DistanceMeters = 134.1900024414062500},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:18:04"), DistanceMeters = 145.9199981689453125},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:18:05"), DistanceMeters = 158.4700012207031250},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:04"), DistanceMeters = 5003.4101562500000000}, //5000 meters driven
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:05"), DistanceMeters = 5018.7797851562500000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:06"), DistanceMeters = 5034.0498046875000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:07"), DistanceMeters = 5048.8901367187500000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:08"), DistanceMeters = 5063.8798828125000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:09"), DistanceMeters = 5079.0200195312500000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:13"), DistanceMeters = 5141.0600585937500000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:17"), DistanceMeters = 5201.7500000000000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:21"), DistanceMeters = 5261.8798828125000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:23"), DistanceMeters = 5290.2900390625000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:28"), DistanceMeters = 5363.7099609375000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:33"), DistanceMeters = 5435.9101562500000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:34"), DistanceMeters = 5450.8901367187500000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:35"), DistanceMeters = 5465.4199218750000000},
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:36"), DistanceMeters = 5480.5400390625000000},
};
对于行驶 5 公里后的每条记录,我想计算最后 5 公里所用的时间。
我的问题是对于 5000 米之后的每条记录,要找到最接近 5000 米之前的记录。我已经查看了MinBy
MoreLinq 的扩展,但我不确定这是否是前进的道路
解决方案
为简单起见,您可以只跟踪您发现的最接近标记的最后一点:
var trackPointList = new List<TrackPoint>
{
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:17:48"), DistanceMeters = 3.8099999427795410},
// ...
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:24:04"), DistanceMeters = 5003.4101562500000000}, //5000 meters driven
// ...
new TrackPoint {Time = DateTime.Parse("2018-08-10 07:30:04"), DistanceMeters = 10003.4101562500000000}, //10000 meters driven
};
// determine how many marks you have according to the highest value recorded
int pointsCount = (int)trackPointList[trackPointList.Count - 1].DistanceMeters % 5000;
var lastPoint = trackPointList[0];
for (int i = 1; i < pointsCount; i++)
{
double point = i * 5000;
// find the closest to the current mark
var currentPoint = trackPointList.Where(x => x.DistanceMeters > point).First();
Console.WriteLine("At {0}, you have driven {1}, {2} for the past 5KM", currentPoint.Time, currentPoint.DistanceMeters, currentPoint.Time - lastPoint.Time);
lastPoint = currentPoint;
}
打印:
At 10/08/2018 07:24:04, you have driven 5003.41015625, 00:06:16 for the past 5KM
At 10/08/2018 07:30:04, you have driven 10003.41015625, 00:06:00 for the past 5KM
推荐阅读
- python - ValueError: 层双向的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:(无、3、3、128)
- python-3.x - 合并熊猫数据框中的行
- node.js - 如何处理多个Nodejs请求同时读取、修改和更新MongoDB中的同一个文档?
- components - 哪种名称适合这种类型的输入字段?
- python - 不和谐.py | 如何从特定用户一次添加的消息中删除所有反应
- css - 位置和重叠问题
- r - 有没有比使用循环更有效的方法来分配 R 中的类别?
- api - 如何使用 tda-api 获取股票期权训练数据?
- python - 另一个类中的实例变量(非单继承)
- python - Pandas 中 Index 和 MultiIndex 的组合(数据框中的嵌套 JSON 表示)