わかりました。範囲を操作するためのこれらの交差メソッドがあり、範囲の端点がnullでない限り、これらは正常に機能します。
public static bool Intersects<T>(this Range<T> first, Range<T> second, IComparer<T> comparer)
{
return comparer.Compare(first.Start, second.End) <= 0
&& comparer.Compare(first.End, second.Start) >= 0;
}
public static Range<T> GetIntersectionWith<T>(this Range<T> first, Range<T> second,
IComparer<T> comparer)
{
// Return null, if any range is null or if they don't intersect at all
if (first == null || second == null || !Intersects(first, second, comparer))
return null;
var start = comparer.Compare(first.Start, second.Start) < 0
? second.Start
: first.Start;
var end = comparer.Compare(first.End, second.End) > 0
? second.End
: first.End;
return Range.Create(start, end);
}
今の私の問題は、彼らにまさにそのヌルエンドポイントをサポートしてもらいたいということです。nullエンドポイントは、範囲がその方向に無限大になることを意味します。合格したい、合格しない2つのテストは、たとえば次のとおりです。
[Test]
public void Intersects_Intersecting_OneEndsWithNull()
{
var a = Range.Create("a", "k");
var b = Range.Create("c", null);
Assert.That(a.Intersects(b), Is.True);
Assert.That(b.Intersects(a), Is.True);
}
[Test]
public void GetIntersectionWith_Intersecting_OneStartingAndOneEndingWithNull()
{
var a = Range.Create(null, "k");
var b = Range.Create("f", null);
var expected = Range.Create("f", "k");
Assert.That(a.GetIntersectionWith(b), Is.EqualTo(expected));
Assert.That(b.GetIntersectionWith(a), Is.EqualTo(expected));
}
すぐに機能しない理由は、nullがすべてよりも少ないと見なされるためです。しかし、ここでnullは、すべてよりも大きいと見なされる場合があります。
これをどのようにうまく解決できるか考えてみませんか?
最初にチェックしnull
て何か特別なことをするか、ある種のIComparer<T>
ラッパーを作成する必要があると思います...しかし、それらがどのように、またはどのように機能する必要があるかを理解することはできません。どんな種類の比較器も与えることができることを覚えておく必要があります。したがって、技術的には、与えられた比較器がそれを考慮に入れている限り、範囲は反対方向になる可能性があります(実際のコードでは、開始が来ると例外をスローします与えられた比較者によると終了後)。とにかく、私はここで少し迷っています:P