0

ユーザーが開始と終了を追加して範囲を定義するアプリケーションを作成しています

条件は、範囲が重複しないことです。

数値範囲が重複していないかどうかを確認する方法

  1. 範囲 1 開始 5 終了 15
  2. 範囲 2 開始 1 終了 4
  3. 範囲 3 開始 16 終了 20
  4. 範囲 4 開始 2 終了 4

したがって、Range 4 はセットを無効にします。これを C# で確認するにはどうすればよいですか。

さらに、ユーザーは上記の例のように任意の順序で範囲を追加できます。シリーズ全体が重複しないようにする必要があります。

ヘルプの提案をありがとう。

よろしく、サクシ

答え:

私は解決策を正しいものにしました:開始と終了が検証する必要がある範囲である場合

  1. start >startRange かつ endRange 未満で開始
  2. end>startRange かつ endRange より小さい end

上記の 2 つの条件は、シリーズが重複していることを検証します。

startRange と endRange は、既存のすべての範囲の開始点と終了点です。

4

2 に答える 2

3

OP は、新しい範囲が既存の範囲と重複していないことを検証するための 2 つのチェックを提案しています。ただし、これら 2 つのチェックですべての可能性がカバーされるわけではありません。たとえば、既存の範囲が (4,10) で、新しい範囲が (2,12) の場合、既存の範囲の開始前に開始され、その後に終了するため、フラグは立てられません。

代わりに、次のアプローチをお勧めします。

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

基本的に、重複する範囲には次の 4 つの可能性があります。

  1. 既存の範囲の前に始まり、既存の範囲内で終わる範囲
  2. 既存の範囲内で開始し、その後で終了する範囲
  3. 既存の範囲内で開始し、既存の範囲内で終了する範囲
  4. 既存の範囲の前に始まり、既存の範囲の後に終わる範囲

ケース (1) と (2) には部分的なオーバーラップが含まれますが、ケース (3) と (4) には完全なオーバーラップ (既存の範囲が新しい範囲を完全に囲む [ケース 3] または新しい範囲が既存の範囲を完全に囲む [ケース 4]) が含まれます。 ]))。
OP のコードは、ケース 1、2、および 3 をキャッチしますが、ケース 4 はキャッチしません。ここのコードは、重複する範囲の 4 つの可能性をすべてキャッチします。

于 2012-09-06T17:35:06.163 に答える