我试图编写一个方法,在给定一个日期列表和一个目标日期的情况下,按时间顺序确定最近的日期。例如,给定一个(简化的)日期集{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;
}
3条答案
按热度按时间b4wnujal1#
那么,使用MoreLINQ中的
MinBy
:换句话说,对于每个日期,通过从一个日期减去另一个日期(四舍五入),在得到的
TimeSpan
中取Ticks
的数字,并求出绝对值,找出差值最小的日期。如果你不能使用MoreLINQ,你可以自己写一些类似的东西,或者分两步做(blech):
niwlg2el2#
使用Last和First会迭代dateSet两次。您可以使用自己的逻辑自己迭代dateSet。这会更有效,但除非您的dateSet非常大,或者由于其他原因枚举dateSet的成本非常高,否则速度上的一点点提高可能不值得编写更复杂的代码。首先,您的代码应该易于理解。
e0uiprwp3#
很简单!