我在找 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 book和 From Russia with Love .似乎也有一些( 1 , 2 )商业解决方案。我以前见过其他人,但现在找不到了。
无论您做什么,在使用通用间隔类型时请注意。实际上很难编写一个正确的整体泛型区间类,因为整数和浮点区间具有不同的数学属性。例如,所有整数区间都可以用闭合端点和对 [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/