测试范围内的间隙
本文关键字:间隙 范围内 测试 | 更新日期: 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 &设置位;结束值。现在你会得到这样的内容
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的索引表示。