c# - 整数无穷大的最佳替代方案

标签 c# visual-studio-2012 infinity

我正在开发有向加权图的权重矩阵。而且我还必须根据权重矩阵的规则插入无穷大。

enter image description here

到目前为止,我坚持使用 C# 的 int.MaxValue 内置函数... 之后,我将这个权重矩阵用于 FloydWarshall 算法,但由于 int.MaxValue 我在输出中得到了非常大的数字。我正在寻找一种可以理解为无穷大的替代方案,但它没有提供很大的值(value)...替代方案可以是什么...?记住使用 int。

最佳答案

  1. 您可以使用Nullable<int> (简称int?),只需使用null意思是“无限”。从技术上讲,这可能没问题,但它不是您想要做的事情的理想语义表示。另请注意,如果您使用数学运算(加法、乘法等)null 的语义当表示无穷大时,值可能并不总是与您想要的相匹配,因此在使用此类运算符时要小心,以及当值为 null/无穷大时您实际希望它们执行的操作。

  2. 您可以使用double ,它支持非数字值,例如 Infinity 。当然,您将存储浮点值,而不是整数。这可能是也可能不是您的应用程序中可以接受的缺点,具体取决于您需要的有效数字的数量以及您对内存/性能问题的敏感程度。

  3. 创建您自己的类型,它包装一个整数(或可为空的整数),但也具有无穷大的表示形式。这基本上看起来就像 Nullable ,并且可能有一个非常类似的公共(public) API,但只是使用 bool 值来跟踪该值是否是无限的,而不是它是否有值。它基本上只是重命名 int? 的公共(public) API 部分的一种方式。符合您的预期用途。它可能看起来与此类似:

    public struct InfiniteInteger
    {
        private int? value;
        public InfiniteInteger()
        {
            this.value = null;
        }
        public InfiniteInteger(int value)
        {
            this.value = value;
        }
        public int Value { get { return value.Value; } }
        public bool IsInfinite { get { return value.HasValue; } }
        //todo explicit/implicit conversion operators as you see fit
        //todo override math operators (+, -, *, %, etc.) as you see fit
        //todo override equality/comparison operators; 
        // these can just be passed down directly to the wrapped value's implementation
    }
    

请注意,在执行不同的运算符时,您可能希望以不同的方式处理无限值,而不是处理可空值,或者您可能不想,这取决于您正在做什么,所以只需花一些时间考虑应该发生什么。

关于c# - 整数无穷大的最佳替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30465206/

相关文章:

c# - 具有部分 View 的 MVC 发布表单返回空模型

c# - Visual Studio 2012 给出了荒谬的错误

c++ - MFC 应用程序启动后立即崩溃

vb.net - 检测 Richtextbox 换行符 Visual basic

c# - 找不到 'ModelBuilder' 的类型或命名空间(是否缺少 using 指令或程序集引用?)

c# - 如何将 DataTable 转换为 List<object>?

c# - 如何用一个空格替换多个空格

Ruby CSV gem 返回 Infinity 而不是 double

r - 为什么 NA_real_ <= Inf 返回 NA?

java - "isNaN(INFINITY)==false"是错误的