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