我希望有一些帮助使这种比较更快(下面的示例)。该示例获取数组中的每个值,将一小时附加到比较变量。如果没有匹配值,则将值添加到第二个数组(稍后连接)。
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个,对吗?但我能找到差距结局,只是创造缺失值吗?这将使o符号取决于差距的数量,而不是值的数量。
另一个受欢迎的答案只是一个更有效的循环。
[编辑] 抱歉英语不好,我尽力描述。
答案 0 :(得分: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);
}
}