.net LINQ查询-最近的相邻日期

btxsgosb  于 2023-02-17  发布在  .NET
关注(0)|答案(3)|浏览(168)

我试图编写一个方法,在给定一个日期列表和一个目标日期的情况下,按时间顺序确定最近的日期。例如,给定一个(简化的)日期集{Jan 2011,March 2011,November 2011},目标日期为April 2011,该方法将返回March 2011
一开始,我想使用LINQ的skip,但是我不确定一个合适的Func,这样它会在日期被超过之前停止。下面这个看起来是一个可行的解决方案,但是我不确定是否有更有效的方法来做到这一点。假设Last和First都是线性时间。
源数据集可以是0到10,000个日期,通常大约是5,000个,而且,我在整个过程中迭代了5到50次(这是不同迭代的目标日期数)。

// assume dateSet are ordered ascending in time.
public DateTime GetClosestDate(IEnumerable<DateTime> dateSet, DateTime targetDate)
{
   var earlierDate = dateSet.Last(x => x <= targetDate);
   var laterDate = dateSet.First(x => x >= targetDate);

   // compare TimeSpans from earlier to target and later to target.
   // return closestTime;
}
b4wnujal

b4wnujal1#

那么,使用MoreLINQ中的MinBy

var nearest = dateSet.MinBy(date => Math.Abs((date - targetDate).Ticks);

换句话说,对于每个日期,通过从一个日期减去另一个日期(四舍五入),在得到的TimeSpan中取Ticks的数字,并求出绝对值,找出差值最小的日期。
如果你不能使用MoreLINQ,你可以自己写一些类似的东西,或者分两步做(blech):

var nearestDiff = dateSet.Min(date => Math.Abs((date - targetDate).Ticks));
var nearest = dateSet.Where(date => Math.Abs((date - targetDate).Ticks) == nearestDiff).First();
niwlg2el

niwlg2el2#

使用Last和First会迭代dateSet两次。您可以使用自己的逻辑自己迭代dateSet。这会更有效,但除非您的dateSet非常大,或者由于其他原因枚举dateSet的成本非常高,否则速度上的一点点提高可能不值得编写更复杂的代码。首先,您的代码应该易于理解。

e0uiprwp

e0uiprwp3#

很简单!

List<DateTime> MyDateTimeList =....;
....

getNearest(DateTime dt)
{
   return MyDateTimeList.OrderBy(t=> Math.ABS((dt-t).TotalMiliSeconds)).First();
}

相关问题