找到最接近所需日期时间的日期时间,并反向循环列表
本文关键字:日期 时间 循环 列表 最接近 | 更新日期: 2023-09-27 17:50:26
我有一个检索到的数据列表,按从以前到最近的日期时间排序。我试图根据我指定的时间和日期在这个列表中向后循环,但是列表中的日期和时间不一定等于我指定的日期时间,所以我希望它在列表中找到最接近的日期时间,然后向后迭代。下面是一个例子:
我想要"3/14/2014 8:35:33 AM"
列表:
- 3/14/2014 8:32:01 am
- 3/14/2014 8:32:02 am
- 3/14/2014 8:32:03 am
- 3/14/2014 8:32:03 am
- 3/14/2014 8:33:03 am
- 3/14/2014 8:33:03 am
- 3/14/2014 8:36:03 am
- 3/14/2014 8:37:03 am
我试着这样做,但我真的迷路了,我不知道从这里去哪里:
foreach(var item in providerQuoteInfo)
{
for(int i = providerQuoteInfo.Count; i >= 0; i--)
{
}
}
providerQuoteInfo
为ProviderQuote
类型的列表。
public class ProviderQuote
{
public DateTime TimeStamp { get; set; }
// ...
}
所以现在我想让它从"3/14/2014 8:33:03 AM"开始,并迭代列表。我怎么能做那样的事?
假设性能不是一个很大的问题,这应该可以达到目的:
// quotes is the list of ProviderQuotes
// reference is the DateTime being used for comparison
IEnumerable<ProviderQuote> toUse = quotes.TakeWhile(q => q.TimeStamp <= reference)
.Reverse();
foreach (ProviderQuote item in toUse)
{
// do something with item
}
如果性能很重要,您可以考虑进行某种二进制搜索来找到最近项的索引,然后从该索引向后迭代,尽管我不认为这会提供多少性能改进。
您可以使用Where()
方法过滤序列并像下面这样循环:
DateTime inputDateTime = "YOUR DATETIME VALUE";
var desiredListProviderQuote =
listProviderQuote
.OrderBy(x => x.TimeStamp)
.Where(x => x.TimeStamp.CompareTo(inputDateTime) <= 0)
.OrderByDescending(x => x.TimeStamp)
.ToList();
foreach (ProviderQuote providerQuote in desiredListProviderQuote)
{
// DO WHAT YOU WANT
}
像这样找到最近的=>对列表进行排序,找到第一个较小或相等的值,找到第一个较大或相等的值(如果相等,则是您的值),如果这两个值不相等,则将差值作为时间跨度。差异最小的值最接近。
伪代码。
var list = new List<DateTime>();
list = list.OrderBy(x => x).ToList();
var target = new DateTime(2014, 3, 14);
var smaller = list.First(x => x <= target);
var bigger = list.First(x => x >= target);
if (smaller == target) Console.WriteLine("Target found");
else
{
var differenceWithSmaller = target - smaller;
var differenceWithBigger = bigger - target;
if(differenceWithSmaller < differenceWithBigger) Console.WriteLine("Smaller is closest to target");
else Console.WriteLine("Bigger is closest to target");
}