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