好的,我有这些交集方法可以处理范围,只要范围端点不为空,它们就可以很好地工作:
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);
}
我现在的问题是我希望他们完全支持空端点。一个空端点意味着范围在那个方向上无限大。我想通过但没有通过的两个测试例如是:
[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