【问题标题】:Check overlapping series in C#在 C# 中检查重叠系列
【发布时间】:2011-09-20 16:58:49
【问题描述】:

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

条件是范围不能重叠:

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

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

所以 Range 4 使设置无效,我如何在 C# 中检查。

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

感谢您的帮助建议。

问候, 飒飒

答案:

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

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

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

其中 startRange 和 endRange 是所有现有范围的起点和终点。

【问题讨论】:

    标签: overlapping


    【解决方案1】:

    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 种可能性。

    【讨论】:

      【解决方案2】:

      范围需要有多个检查:

      您可以有许多不同的重叠,因此您需要进行多次测试。

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

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

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

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

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

      这些检查假定 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;
          }
      

      【讨论】:

      • 使用下面的方法,因为它比我的更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多