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