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

时间:2014-03-14 13:12:24

标签: c# loops

我有一个我检索过的数据列表,并且是从之前的更新日期时间开始订购的。我试图根据我指定的时间和日期在此列表中向后循环,但是列表中的日期和时间不一定等于我指定的日期时间,所以我希望它在列表中找到最接近的日期时间然后向后迭代。这是一个例子:

我想要“2014年3月14日上午8:35:33”

列表:

  • 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”开始并迭代列表。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

假设表现不是一个巨大的问题,这应该可以解决问题:

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

如果性能很重要,你可以考虑进行某种二进制搜索以找到最近项的索引,然后从该索引向后迭代,尽管我没有看到提供这么多的性能改进。

答案 1 :(得分:1)

您可以使用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
}

答案 2 :(得分:0)

像这样找到最近的=&gt; 对列表进行排序,找到小于或等于的第一个值,找到大于或等于的第一个值(如果等于你的值),如果不是这两个值,则将差值作为时间跨度。差异最小的值是最接近的值。

伪代码。

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