C# 测试范围内的间隙

C# 测试范围内的间隙,c#,C#,我需要测试数据库中的某些对象是否填充特定范围,即0-999 我使用C语言创建了一个通用类,使用IComparable测试交叉点。这很好,但我需要反转,并找到我在这个时间间隔内的所有间隙 我的数据库对象具有开始和结束属性,即整数。我可以找到缺口的位置,但我需要对它们进行聚类以创建缺失的部分 foreach (var interval in intervals) { for (int i = 0; i <= 999; i++) { if (Range<in

我需要测试数据库中的某些对象是否填充特定范围,即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);
    }
}
有了这个代码,我就有了一个很好的漏洞列表。我现在想做的是将这些值分组,但我发现我的解决方案不是最优的,当然也不是优雅的

我读过关于位数组的文章,但它们能帮我什么忙呢?我希望从一系列范围中,我能找到固定范围内的差距。如果我们讨论的是一条直线,我基本上需要固定间隔的结果

我只能用.NET来解决这个问题。我有一个很大的中间件,这个验证过程一天会发生好几次,所以我宁愿不必通过中间件然后通过Databaser来解决

让我试着画一幅画

需要填充的固定范围

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;
    }
}
我需要找出起点和终点之间的差距,而不是连续的间隔

帮忙

假设位数组中的每个“0”表示时间单位秒、小时等。 开始循环间隔,并根据开始和结束值设置位。 现在你会有这样的东西

11110001111110001111000111000
“0”是您的分组间隙

假设位数组中的每个“0”表示时间单位秒、小时等。 开始循环间隔,并根据开始和结束值设置位。 现在你会有这样的东西

11110001111110001111000111000

“0”是您的分组间隙

如果整数值可以用实体表示,您可以使用SQL来表示。然后,只需创建一个具有单列seq的表,其中所有值都是从0到999的值,然后使用左外部联接,将该表与该实体联接,并仅选择实体为null的id

示例查询应该如下所示

SELECT ts.seq
 FROM sequenceTable ts LEFT OUTER JOIN sourceTable st ON ts.seq = st.entity
WHERE st.entity is null;  
您可以使用row num创建表SEAUNETABLE的列seq

-编辑

由于解决方案应该在CLR中,因此可以使用集合,创建一个值介于0到999之间的列表,然后从中删除所有间隔


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

您可以使用SQL进行此操作,如果整数值可以用实体表示。然后,只需创建一个具有单列seq的表,其中所有值都是从0到999的值,然后使用左外部联接,将该表与该实体联接,并仅选择实体为null的id

示例查询应该如下所示

SELECT ts.seq
 FROM sequenceTable ts LEFT OUTER JOIN sourceTable st ON ts.seq = st.entity
WHERE st.entity is null;  
您可以使用row num创建表SEAUNETABLE的列seq

-编辑

由于解决方案应该在CLR中,因此可以使用集合,创建一个值介于0到999之间的列表,然后从中删除所有间隔


下一个解决方案是使用布尔数组。在这种情况下,创建长度为999的数组,然后遍历区间,并使用区间作为索引,其中布尔数组中的值为true,然后只需再次遍历该数组,缺失的区间将由索引表示,其中的值为false。

感谢一个很酷的解决方案,但我将更新我的帖子。我不能使用原始sql来解决这个问题。它必须是一个纯CLR解决方案。谢谢一个很酷的解决方案,但我会更新我的帖子。我不能使用原始sql来解决这个问题。它必须是纯CLR解决方案。@George为什么需要它?你应该做像和异或之类的逐位运算,或者你是在问bitArray.Setindex,bool?Humn,这是真的LB。这可能会做到@乔治,你为什么需要它?你应该做像和异或之类的逐位运算,或者你是在问bitArray.Setindex,bool?Humn,这是真的LB。这可能会做到!您需要以起始点/端点对为单位的间隔,还是只需要不在该范围内按顺序显示的所有整数?你只希望结果为1,4,5,6,7,还是希望结果为1-1,4-7?你的范围对象是什么?我似乎在任何地方都找不到它……你需要以起始点/端点对为单位的间隔,还是只需要所有不在该范围内的整数按顺序排列?你只希望结果为1,4,5,6,7,还是希望结果为1-1,4-7?你的范围对象是什么?我好像到处都找不到。。。