找到最接近所需日期时间的日期时间,并反向循环列表

本文关键字:日期 时间 循环 列表 最接近 | 更新日期: 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--)
   {
   }
}

providerQuoteInfoProviderQuote类型的列表。

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