在C#中是否有用于区间标度值的接口?

在C#中是否有用于区间标度值的接口?,c#,intervals,icomparable,c5,C#,Intervals,Icomparable,C5,我正在利用著名的C#图书馆。IInterval接口定义了具有可比较端点的间隔(删除了不相关的成员): public interface IInterval,其中T:i可比较 { T Low{get;} T High{get;} } 这在一般情况下效果很好,因为区间端点可以是任何可比较的东西,比如整数、日期甚至字符串 然而,有时能够计算时间间隔的持续时间是有利的。间隔[3:5)的持续时间为2,间隔[1PM,9PM)的持续时间为8小时。这在可比数据中是不可能的,因为它只给出元素的顺序,而不是它们的

我正在利用著名的C#图书馆。
IInterval
接口定义了具有可比较端点的间隔(删除了不相关的成员):

public interface IInterval,其中T:i可比较
{
T Low{get;}
T High{get;}
}
这在一般情况下效果很好,因为区间端点可以是任何可比较的东西,比如整数、日期甚至字符串

然而,有时能够计算时间间隔的持续时间是有利的。间隔
[3:5)
的持续时间为2,间隔
[1PM,9PM)
的持续时间为8小时。这在可比数据中是不可能的,因为它只给出元素的顺序,而不是它们的距离,例如,很难给出两个字符串之间的距离。端点类型基本上必须是

是否有一个像
IComparable
这样的接口,它允许我比较端点,但也可以做一些事情,比如减去两个端点以获得一个持续时间,向低端添加一个持续时间以获得可以用于继承接口的高端,例如
IDurationInterval:IInterval


或者更简洁一点:是否有用于间隔缩放值的接口?

不存在此类接口。有些语言,如Scala,对这些类型的操作有抽象,但.NET没有。此外,我发现.NET库设计者在添加抽象级别时相当保守:似乎他们更喜欢简单和具体胜过复杂和抽象。他们从未添加过这种抽象,大概是因为在任何.NET Framework的库中都没有迫切需要它。此外,如果使用不当,这种抽象可能会导致大量开销

但是,在.NET的类型系统中,没有什么可以排除这样的接口。它需要两个类型参数,而不是一个:一个用于实现类型,另一个用于结果类型。最基本的接口可能如下所示:

interface IAlgebraic<T, R> {
  T Add(R value)
  R Subtract(T value)
}
接口对话框{
T加(R值)
R减去(T值)
}
不幸的是,无法将此接口添加到现有类型,如Int32和DateTime。对于这些类型,您需要一个
IComparable
比较器的推论

接口IAlgebraicOps{
T加(T x,R y)
R减法(tx,ty)
}

这也是到目前为止我最好的想法。我担心这会增加太多的开销,但这样做可能有足够的意义。您可以使用
T add(R difference)
T Subtract(R difference)
R difference(T other)方法制作一个像
IDurationInterval
这样的界面
。然而,这仍然有其缺点,因为您仍然无法找到区间的中间值。但我确实喜欢总体思路!通过接口进行虚拟方法调用的开销只有在与可用于简单数据类型(如INT)的简单add处理器指令相比时才会更大。除非您需要一秒钟要做数百万次计算,我怀疑你是否会注意到其中的差异。提到中点带来了另一个好处。虽然你可以抽象出加法和减法之类的数学运算,但很难知道停止的地方。Scala的通用接口Numeric有比较、加法、减法、乘法等运算、aboslute、1和0。Int、Long、Float和Double可以支持所有这些,但只有前3个对DateTime有意义。实际上,可以创建一个接口层次结构。它的基础是可比较的。有一个接口支持加法、减法和类似的操作。抽象代数实际上已经分析和描述了我对可能的抽象进行了大量的详细分析。但是,我认为对于大多数实际用途来说,IComparable>IAddSubtract>INumeric(用于乘法、零、一和绝对)>IDivisible(用于除法支持)的接口层次结构可以捕获任何可能需要的内容(除非有更好的名称)。我开始处理接口时,突然想到端点必须是间隔缩放值:。我已相应地更新了问题。
interface IAlgebraic<T, R> {
  T Add(R value)
  R Subtract(T value)
}
interface IAlgebraicOps<T, R> {
  T Add(T x, R y)
  R Subtract(T x, T y)
}