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

时间:2015-05-26 17:33:32

标签: c# visual-studio-2012 infinity

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

enter image description here

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

1 个答案:

答案 0 :(得分:5)

  1. 您可以使用Nullable<int>(简称int?)并使用null表示“无限”。从技术上讲,这可能会很好,但它不是你想要做的理想的语义表示。另请注意,如果使用数学运算(加法,乘法等),null值的语义可能并不总是与表示无穷大时所需的值匹配,因此在使用此类运算符时要小心,当值为null /无限时,你真正希望他们做什么。

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

  3. 创建自己的包装整数(或可以为空的整数)的类型,但也有无穷大的表示。这基本上看起来就像Nullable,并且可能有一个非常类似的公共API,但只是使用布尔来跟踪值是否是无限的,而不是是否或不是它有价值。它基本上只是一种重命名int?的公共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
    }
    
  4. 请注意,在执行不同的运算符而不是处理可空值时,您可能希望以不同的方式处理无限值,或者您可能不会,这取决于您正在执行的操作,因此只需花一些时间来考虑应该发生的事情。 / p>