测试范围内的间隙

本文关键字:间隙 范围内 测试 | 更新日期: 2023-09-27 18:12:22

我需要测试数据库中的一些对象是否填充特定范围,即0-999。

我正在使用c#,我已经创建了一个通用类使用IComparable来测试交集。这很好,但我需要反转并找到在这个区间内的所有间隙。

我的数据库对象有开始和结束属性,它们是整数。我可以找到缺口的地方,但我需要把它们聚在一起来创建缺失的部分。

foreach (var interval in intervals)
{
    for (int i = 0; i <= 999; i++)
    {
        if (Range<int>.Intersects(interval,new Range<int>(i,i)))
            continue;
        else
            doesNotIntersect.Add(i);
    }
}
有了这段代码,我就有了一个漂亮的"洞"列表。我现在要做的是对这些值进行分组,但我发现我的解决方案不是最优的,当然也不优雅。

我读过BitArrays,但是它们能帮我什么呢?我希望从一个范围的列表中,我可以找到一个固定范围的差距。如果我们讨论的是一条线,我需要的基本上是固定间隔的结果。

我只能用。net解决这个问题。我有一个很大的中间件,这个验证过程每天会发生几次,所以我不喜欢通过中间件,然后数据库来解决。

让我试着创建一个图片

固定需要填充的范围

111111111

对象提供的范围

101100001

需要填充的范围

010011110

这是我的范围对象:

public class Range<T> where T : IComparable
{
    public T Start { get; set; }
    public T End { get; set; }
    public Range(T start, T end)
    {
        Start = start;
        End = end;
    }
    public static bool Intersects(Range<T> left,Range<T> right)
    {
        if (left.Start.CompareTo(right.Start) == 0)
            return true;
        if (left.Start.CompareTo(right.Start) > 0)
        {
            return left.Start.CompareTo(right.End) <= 0;
        }
        return right.Start.CompareTo(left.End) <= 0;
    }
}

我需要找到开始和结束点之间的间隔,而不是连续的间隔。

帮助吗?

测试范围内的间隙

00000000000000000000000000000
|              |
8:00           9:00                       

假设bitarray中的每个'0'都代表一个时间单位(秒,小时等)。开始循环间隔并根据Start &amp设置位;结束值。现在你会得到这样的内容

11110001111110001111000111000

如果整数值可以用实体表示,则可以使用SQL。然后创建一个单列seq表,其中所有值从0到999,然后使用左外连接,将表与该实体连接,并只选择那些id,其中实体为空。

示例查询应该是这样的。

SELECT ts.seq
 FROM sequenceTable ts LEFT OUTER JOIN sourceTable st ON ts.seq = st.entity
WHERE st.entity is null;  

您可以使用行号来创建seauenceTable表的列序列。

——编辑

作为CLR中的解决方案,您可以使用use Collections,创建一个值从0到999的List,然后从该间隔中删除所有值。

下一个解决方案是使用布尔数组。创建具有适当长度的数组(在本例中为999),然后遍历间隔,并使用间隔作为索引,在布尔数组中为其值为true的地方,然后再次遍历该数组,缺失的间隔将由值为false的索引表示。