日期比较任务的更好算法

本文关键字:更好 算法 任务 比较 日期 | 更新日期: 2023-09-27 18:14:06

我想要一些帮助,使这个比较更快(示例如下)。该示例取数组中的每个值,将一个小时附加到一个比较变量。如果没有匹配值,则将该值添加到第二个数组中(稍后将其连接起来)。

 if (ticks.TypeOf  == Period.Hour)
   while (compareAt <= endAt)
   {
      if (range.Where(d => d.time.AddMinutes(-d.time.Minute) == compareAt).Count() < 1)
         gaps.Add(new SomeValue() {
             ...some dummy values..  });
      compareAt = compareAt.AddTicks(ticks.Ticks);
   }

这个执行太耗费时间了。这个数组中最多有一个365 * 24 = 8760值。将来,每月还会有分/秒60*24*31=44640,这意味着不可用

如果数组通常是完整的(这意味着没有间隙/空槽),它可以很容易地通过if (range.Count() == (hours/day * days))。然而,那一天不会是今天。

我怎样才能更有效地解决它?

一个例子:如果数组中有7800个值,我们就会丢失950个,对吗?但我能不能找到缺口,创造缺失的价值?这将使0符号依赖于间隙的数量,而不是值的数量。

另一个受欢迎的答案只是一个更有效的循环。

[编辑]对不起,我的英语不好,我已经尽力描述了。

日期比较任务的更好算法

您的性能很低,因为范围查找不使用任何索引,并且每次都重新检查整个范围。

一种更快的方法;

    if (ticks.TypeOf == Period.Hour)
    {
        // fill a hashset with the range's unique hourly values 
        var rangehs = new HashSet<DateTime>();
        foreach (var r in range)
        {
            rangehs.Add(r.time.AddMinutes(-r.time.Minute));
        }
        // walk all the hours
        while (compareAt <= endAt)
        {
            // quickly check if it's a gap
            if (!rangehs.Contains(compareAt))
                gaps.Add(new SomeValue() {     ...some dummy values..});
            compareAt = compareAt.AddTicks(ticks.Ticks);
        }
    }