C# 中是否有用于区间标度值的接口?
Is there an interface in C# for interval-scaled values?
我正在制作 an interval collection extension of the famous C# library C5。 IInterval
接口定义了一个具有可比端点的区间(不相关的成员已删除):
public interface IInterval<T> where T : IComparable<T>
{
T Low { get; }
T High { get; }
}
这在一般情况下效果很好,因为区间端点可以是任何可比较的东西,如整数、日期,甚至字符串。
但是,有时能够计算间隔的持续时间是有利的。间隔 [3:5)
的持续时间为 2,间隔 [1PM, 9PM)
的持续时间为 8 小时。这对于 comparables 是不可能的,因为它只给我们元素的顺序,而不是它们的距离,例如很难给出两个字符串之间的距离。端点类型基本上必须是 interval-scaled values.
是否有像 IComparable<T>
这样的界面,它允许我比较一般的端点,但也可以做一些事情,比如减去两个端点以获得持续时间,并将持续时间添加到低端点以获得高可用于继承接口的端点,例如 IDurationInterval<T> : IInterval<T>
?
或者更简洁:是否有用于区间标度值的接口?
不存在这样的界面。有些语言,如 Scala,对这些类型的操作进行了抽象,但 .NET 有 none。此外,我发现 .NET 库设计者在添加抽象级别时相当保守:他们似乎更喜欢简单和具体而不是复杂和抽象。他们从未添加过这种抽象,大概是因为在任何 .NET Framework 的库中都没有对它的迫切需求。此外,它是一种抽象,如果使用不当会导致大量开销。
但是,.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)
}
我正在制作 an interval collection extension of the famous C# library C5。 IInterval
接口定义了一个具有可比端点的区间(不相关的成员已删除):
public interface IInterval<T> where T : IComparable<T>
{
T Low { get; }
T High { get; }
}
这在一般情况下效果很好,因为区间端点可以是任何可比较的东西,如整数、日期,甚至字符串。
但是,有时能够计算间隔的持续时间是有利的。间隔 [3:5)
的持续时间为 2,间隔 [1PM, 9PM)
的持续时间为 8 小时。这对于 comparables 是不可能的,因为它只给我们元素的顺序,而不是它们的距离,例如很难给出两个字符串之间的距离。端点类型基本上必须是 interval-scaled values.
是否有像 IComparable<T>
这样的界面,它允许我比较一般的端点,但也可以做一些事情,比如减去两个端点以获得持续时间,并将持续时间添加到低端点以获得高可用于继承接口的端点,例如 IDurationInterval<T> : IInterval<T>
?
或者更简洁:是否有用于区间标度值的接口?
不存在这样的界面。有些语言,如 Scala,对这些类型的操作进行了抽象,但 .NET 有 none。此外,我发现 .NET 库设计者在添加抽象级别时相当保守:他们似乎更喜欢简单和具体而不是复杂和抽象。他们从未添加过这种抽象,大概是因为在任何 .NET Framework 的库中都没有对它的迫切需求。此外,它是一种抽象,如果使用不当会导致大量开销。
但是,.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)
}