C# 计算最快的5公里时间

C# 计算最快的5公里时间,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我有一台自行车电脑,每秒钟记录我走了多远 数据的简化版本如下所示: 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 L

我有一台自行车电脑,每秒钟记录我走了多远

数据的简化版本如下所示:

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},
};
公共类跟踪点
{
公共虚拟Guid Id{get;set;}=Guid.NewGuid();
公共虚拟日期时间{get;set;}
公共虚拟双测距仪{get;set;}
}
var trackPointList=新列表
{
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:48”),距离计=3.809994927795410},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:49”),距离计=7.7600002288818359},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:50”),DistanceMeters=12.329992937060547},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:51”),距离计=18.0000000000000000},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:52”),DistanceMeters=24.89996185302734},
新的TrackPoint{Time=DateTime.Parse(“2018-08-10 07:17:53”),DistanceMeters=32.1599998474121094},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:54”),距离计=40.7200012207031250},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:55”),DistanceMeters=49.7599983215332031},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:57”),距离计=68.610006103515625},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:17:58”),距离计=79.319996948242188},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:18:00”),DistanceMeters=100.1900024414062500},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:18:02”),DistanceMeters=122.70990844726563},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:18:03”),距离计=134.1900024414062500},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:18:04”),DistanceMeters=145.9199981689453125},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:18:05”),距离计=158.4700012207031250},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:04”),距离米=5003.41015650000000},//5000米驱动
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:05”),距离计=5018.779785156500000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:06”),距离计=5034.049804687500000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:07”),距离计=5048.8901367187500000},
新的跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:08”),DistanceMeters=5063.8798828125000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:09”),距离计=5079.0200195312500000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:13”),距离计=5141.0600585937500000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:17”),距离计=5201.750000000000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:21”),距离计=5261.8798828125000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:23”),距离计=5290.290039062500000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:28”),距离计=5363.7099609375000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:33”),距离计=5435.91015650000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:34”),距离计=5450.8901367187500000},
新的TrackPoint{Time=DateTime.Parse(“2018-08-10 07:24:35”),DistanceMeters=5465.419921875000000},
新跟踪点{Time=DateTime.Parse(“2018-08-10 07:24:36”),距离计=5480.540039062500000},
};
对于行驶5公里后的每条记录,我想计算最后5公里所用的时间

我的问题是,对于5000米之后的每条记录,要找到距离5000米之前最近的记录。我已经看过MoreLinq的
MinBy
扩展,但我不确定它是否是使用System.Linq的未来之路;
using System.Linq;

...

  Dictionary<TrackPoint, TimeSpan> TimeSpans = new Dictionary<TrackPoint, TimeSpan>();

  foreach (var trackpoint in trackPointList.Where(x => x.DistanceMeters >= 5000))
  {
    double distance = trackpoint.DistanceMeters;
    foreach (var trackpoint2 in trackPointList.Where(x => x.DistanceMeters < distance).Reverse())
    {
      if (trackpoint2.DistanceMeters <= distance - 5000)
      {
        TimeSpans.Add(trackpoint, trackpoint.Time - trackpoint2.Time);
        break;
      }
    }
  }
... 字典时间跨度=新字典(); foreach(trackPointList.Where(x=>x.DistanceMeters>=5000)中的var trackpoint) { 双倍距离=轨迹点距离计; foreach(trackPointList.Where中的var trackpoint2(x=>x.DistanceMeters如果(trackpoint2.DistanceMeters保持简单,您可以只跟踪您找到的最接近标记的最后一个点:

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

通过将此方法添加到trackpoint类中,您可以根据用户定义的距离获取上一个方法(如果未找到,则返回null)


@Camiloterivinto,等一下,我会更新这个问题。.作为补充说明,如果助手方法或构造函数接受字符串和双精度,并返回
跟踪点
@JonSkeet,您的代码将更加简洁易读。上面的代码是从我的数据库自动生成的。这对于其他目的可能没问题,但我如果目标是提供一个简单的答案,那么花点时间将其改为尽可能简单是值得的。您对效率有多在意?目前为止的答案相当低效,但很简单-这可能对您来说是好的,也可能不是。请在问题中指出这一点。
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
public class TrackPoint
        {
            public virtual Guid Id { get; set; } = Guid.NewGuid();
            public virtual DateTime Time { get; set; }
            public virtual double DistanceMeters { get; set; }

            public TrackPoint GetPreviousByDistance(double Distance, List<TrackPoint> TrackPointsPoints)
            {
                TrackPoint prevTrackpoint = null;
                double prevDistance = this.DistanceMeters - Distance;
                if (prevDistance > 0)
                {
                    prevTrackpoint = TrackPointsPoints.Where(tp => tp.DistanceMeters < prevDistance).OrderByDescending(tp => tp.DistanceMeters).FirstOrDefault();
                }
                return prevTrackpoint;
            }
        }
 TrackPoint ThisTrackPoint = trackPointList[22]; //Or however you want to define it
 TrackPoint PreviosTrackPoint = ThisTrackPoint.GetPreviousByDistance(5000, trackPointList);  // Can change distance as needed