c#中是否有用于区间缩放值的接口?
本文关键字:接口 缩放 区间 是否 用于 | 更新日期: 2023-09-27 18:03:01
我正在制作著名的c#库C5的间隔集合扩展。IInterval
接口定义了一个具有可比较端点(删除不相关成员)的区间:
public interface IInterval<T> where T : IComparable<T>
{
T Low { get; }
T High { get; }
}
这在一般情况下工作得很好,因为间隔端点可以是任何可比较的东西,如整数、日期甚至字符串。
然而,有时能够计算一个区间的持续时间是有利的。间隔[3:5)
的持续时间为2小时,间隔[1PM, 9PM)
的持续时间为8小时。这对于可比较对象是不可能的,因为它只给我们元素的顺序,而不是它们的距离,例如,很难给出两个字符串之间的距离。端点类型基本上必须是间隔缩放的值。
是否有一个像IComparable<T>
这样的接口,允许我在一般情况下比较端点,但也可以做一些事情,比如减去两个端点以获得持续时间,并将持续时间添加到低端点以获得可用于继承接口的高端点,例如IDurationInterval<T> : IInterval<T>
?
或者更简洁:是否有间隔缩放值的接口?
不存在此接口。有些语言,比如Scala,对这类操作有抽象,但是。net没有。此外,我发现。net库设计者在添加抽象层次时相当保守:他们似乎更倾向于简单和具体,而不是复杂和抽象。他们从未添加过这种抽象,大概是因为在任何。net框架的库中都没有对它的迫切需求。此外,如果使用不当,它是一个抽象,可能会导致大量开销。
然而,在。net的类型系统中没有任何东西阻止这样的接口。它将需要两个类型参数,而不是一个:一个用于实现类型,另一个用于结果类型。最基本的界面可能是这样的:
interface IAlgebraic<T, R> {
T Add(R value)
R Subtract(T value)
}
不幸的是,没有办法将这个接口添加到现有类型中,比如Int32和DateTime。对于这些类型,您需要IComparable<T>
的Comparer<T>
的推论。
interface IAlgebraicOps<T, R> {
T Add(T x, R y)
R Subtract(T x, T y)
}