c# - C# .NET 的区间数据类型?

标签 c# .net types

我在找 interval .NET 4.0 的数据类型。例如区间 (a,b),所有点 x 使得 a

我想做的是创建具有以下属性的间隔:

  • 封闭式和开放式
  • 无界区间、完全无界和右/左无界。

有了这些我想做这样的事情:

  • 检查一个点是否在区间内。
  • 检查两个区间是否重叠。
  • 将两个重叠区间合并为一个区间。
  • 检查区间集合是否涵盖单个区间。
  • 等等:)

如果我可以同时使用数字数据类型和日期时间,那就太好了。

我知道逻辑非常简单,但我也看不出我是第一个需要这样东西的人。

最佳答案

2019 年编辑:从 C# 8.0/.NET Core 3.x/.NET Standard 2.1 开始,现在有一个 System.Range 提供端点的最小间隔功能。我将按原样保留此答案的其余部分。

正如其他人所说,没有集成的间隔类型。根据项目的需要,一个简单的 Tuple<T1, T2> 或调用 Enumerable.Range 加上几行额外的代码可能就足够了。 HashSet<T> 包含集合操作方法,例如 UnionWith、IntersectWith 等,但仍然存储所有项,而不仅仅是端点。

可以在网上找到许多实现。有基本的generic Range class的一部分 Microsoft Research Dynamic Data Display project另一个来自 Kevin Gadd . AForge 项目包含一个非通用的 IntInterval/DoubleInterval implementation .其他 ( 1 , 2 ) SO 问题也可能很有趣。 Andy Clymer 在 his blog 上有一个有趣的动态编译实现.更完整的解决方案可以在 CodeProject 上找到, 在 Jon Skeet's bookFrom Russia with Love .似乎也有一些( 12 )商业解决方案。我以前见过其他人,但现在找不到了。

无论您做什么,在使用通用间隔类型时请注意。实际上很难编写一个正确的整体泛型区间类,因为整数和浮点区间具有不同的数学属性。例如,所有整数区间都可以用闭合端点和对 [1,2] [3,6] 表示。可以认为是连续的,相当于[1,6] .对于浮点间隔,这些都不是真的。参见 Wikipedia了解详情。一组类可能会更好,使用抽象通用基类和类型化的派生类 IntInterval 或 DoubleInterval 来实现不同的行为。

除了数学之外,通用区间类型还有一些实现困难。在 C# 中用泛型轻松地进行算术运算是不可能的,并且需要处理浮点 NaN 和舍入错误。查看Boost library documentation for Interval<T> 有关更多信息。 (其中很多转换为 C# 和 .NET。)幸运的是,许多操作只需 IComparable<T> 即可完成。 .

正如我之前提到的,在功能和正确性方面选择合适的内容完全取决于您项目的要求。

关于c# - C# .NET 的区间数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4157467/

相关文章:

c# - 为什么我得到 AutoMapper int 到 int[] 数组的异常

.NET Azure 存储客户端 - StartCopyFromUri 403 具有 IP 限制 token

scala - 无法覆盖具有非 volatile 上限的类型

python - Python 在添加两个变量时选择的默认值是多少?

java - 将JAVA代码KeyStore.getInstance转为c#

c# - 不同 getter 样式之间的 C# 差异

c# - 为什么只有国家的CultureInfo才是中立文化?

c# - 即使在需要时也不会发生垃圾收集

.net - "Out of band library"到底是什么意思?

haskell - Haskell 中数据族的模式匹配