0

我正在制作一个应用程序,用户添加开始和结束来定义范围

条件是范围不应重叠:

如何检查数字范围是否不重叠,例如

  1. 范围 1 开始 5 结束 15
  2. 范围 2 开始 1 结束 4
  3. 范围 3 开始 16 结束 20
  4. 范围 4 开始 2 结束 4

所以 Range 4 使集合无效,我如何在 C# 中检查它。

此外,用户可以按照上面示例中的任何顺序添加范围,整个系列应该不重叠。

感谢您的帮助建议。

问候, 萨克希

回答:

我提出的解决方案是否正确:如果 start 和 end 是需要验证的范围,那么

  1. start >startRange 并且开始小于 endRange
  2. end>startRange 并且 end 小于 endRange

上述 2 个条件验证该系列是重叠的。

其中 startRange 和 endRange 是所有现有范围的开始和结束。

4

2 回答 2

3

OP 建议进行两项检查以验证新范围与现有范围不重叠。但是,这两项检查并未涵盖所有可能性。例如,如果现有范围是 (4,10) 而新范围是 (2,12),则不会标记它,因为它在现有范围开始之前开始,然后结束。

相反,我建议采用以下方法:

if (newRangeStart <= existingRangeEnd && newRangeEnd >= existingRangeStart) {
    // we have an overlap
}

本质上,重叠范围有四种可能性:

  1. 在现有范围之前开始并在现有范围内结束的范围
  2. 在现有范围内开始并在其后结束的范围
  3. 在现有范围内开始并在现有范围内结束的范围
  4. 在现有范围之前开始并在现有范围之后结束的范围

情况 (1) 和 (2) 包括部分重叠,而情况 (3) 和 (4) 包括完全重叠(现有范围完全包围新范围 [情况 3] 或新范围完全包围现有范围 [情况 4] ])。
OP 的代码捕获了案例 1、2 和 3,但没有捕获案例 4。此处的代码捕获了重叠范围的所有 4 种可能性。

于 2012-09-06T17:35:06.163 回答
0

范围需要有多个检查:

您可以有许多重叠变化,因此您需要进行多次测试。

|-----------|       |--------------|
    |------------------------|
         |-------------|
|--------------------------------|

第一次检查:范围 1 的开始 >= 范围 2 的开始和范围 1 的开始 <= 范围 2 的结束

第二次检查:范围 2 的开始 >= 范围 1 的开始和范围 2 的开始 <= 范围 1 的结束

第三次检查:范围 1 的结束 >= 范围 2 的开始和范围 1 的结束 <= 范围 2 的结束

第四次检查:范围 2 的结束 >= 范围 1 的开始和范围 2 的结束 <= 范围 1 的结束

这些检查假定 End >= Start 在两个范围内。如果没有,您需要交换测试的开始和结束。

    public static bool DoRangesOverlap(int p_start1, int p_end1, int p_start2, int p_end2)
    {
        if ((p_start1 >= p_start2 && p_start1 <= p_end2) || (p_start2 >= p_start1 && p_start2 <= p_end1) || (p_end1 >= p_start2 && p_end1 <= p_end2) || (p_end2 >= p_start1 && p_end2 <= p_end1))
        {
            return true;
        }

        return false;
    }
于 2013-11-18T23:16:16.650 回答