C# 日期比较任务的更好算法
我想得到一些帮助,使这个比较更快(下面的示例)。示例获取数组中的每个值,将一个小时附加到比较变量。如果没有匹配的值,则需要将该值添加到第二个数组(稍后将其连接)C# 日期比较任务的更好算法,c#,performance,algorithm,C#,Performance,Algorithm,我想得到一些帮助,使这个比较更快(下面的示例)。示例获取数组中的每个值,将一个小时附加到比较变量。如果没有匹配的值,则需要将该值添加到第二个数组(稍后将其连接) if(ticks.TypeOf==Period.Hour) while(compareAt d.time.AddMinutes(-d.time.Minute)=compareAt.Count()
if(ticks.TypeOf==Period.Hour)
while(compareAt d.time.AddMinutes(-d.time.Minute)=compareAt.Count()<1)
gaps.Add(newsomevalue()){
…一些虚拟值…});
compareAt=compareAt.AddTicks(ticks.ticks);
}
这一执行在时间上过于消耗。此数组中最多有365*24=8760
个值。将来,每月还将有分钟/秒60*24*31=44640
,这意味着无法使用
如果阵列通常是完整的(这意味着没有间隙/空插槽),则可以使用If(range.Count()==(hours/day*days))
轻松传递该阵列。不过,那一天不会是今天
我怎样才能更有效地解决它
举个例子:如果数组中有7800个值,我们会错过大约950个,对吗?但是我能不能只找到间隙端点,然后创建缺失的值?这将使o表示法取决于间隙的大小,而不是值的大小
另一个受欢迎的答案是更有效的循环
[编辑]
对不起,英语不好,我尽力描述。您的性能很低,因为范围查找没有使用任何索引,每次都会重新检查整个范围 一种方法可以更快地完成这项工作
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);
}
}
if(ticks.TypeOf==Period.Hour)
{
//用范围的唯一小时值填充哈希集
var rangehs=新的HashSet();
foreach(范围内的var r)
{
rangehs.Add(r.time.AddMinutes(-r.time.minutes));
}
//整天步行
虽然我读了两遍你的问题,但我仍然不确定你在问什么。“数组中的间隙”,你说的是数组中的空插槽?还是间隔?请重写你的问题,使其更有意义。对不起,我不明白你想做什么。@Lasse Gaps表示空插槽!对不起,对于英国人来说。时间跨度可以是20110101 00:00--20110601 23:00
,但缺少值,即20110303 14:00 201103之间04 04:00
这不就是对它们进行排序,并对它们进行迭代,然后处理一个项目和下一个项目之间的差异吗?这样你就可以很容易地识别出任何缺少的值。@Lasse,嗯……这正是上面的代码示例所做的……而且比较一年中的小时数需要很多时间。
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);
}
}