代码之家  ›  专栏  ›  技术社区  ›  Brett Allen

.NET中有“数字”结构/类吗?

  •  1
  • Brett Allen  · 技术社区  · 15 年前

    我正试图储存 可变长度 可以将前导零作为该数字的一部分的数字。

    .NET框架中是否有一个类能够存储这样的值 不会丢失前导零的信息 并且可以 超过长的上限 ?

    我目前将它们存储在这样的类中,如果bcl中没有可用的结构或类,我是否可以更好地编写此类:

    [Serializable]
    public class Number
    {
        public int[] Array { get; set; }
        public int Length { get { return Array.Length; } }
    
        public Number(string number)
        {
            Array = new int[number.Length];
    
            for (int i = 0; i < number.Length; i++)
            {
                Array[i] = Convert.ToInt32(number[i].ToString());
            }
        }
    
        public Number(int[] array)
        {
            Array = array;
        }
    
        public int ToInt()
        {
            return Convert.ToInt32(ToString());
        }
    
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder(Array.Length);
    
            foreach (int i in Array)
                sb.Append(i);
    
            return sb.ToString();
        }
    }
    

    将其用作结构的能力将非常有用,并且可以轻松地检查相等性。

    粗体/斜体项目是此类项目的要求。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Community CDub    7 年前

    我建议你看看这个 question about big integers in C# . 您可以将它们扩展为前导零问题。

        2
  •  2
  •   Nick Larsen    15 年前

    我看到您的类有许多问题,应该通过重新设计来解决。

    • 您的类表示一个值,并且是可变的。
    • 采用int数组参数的构造函数只复制引用。
    • 该值可以大于long,但作为toint()方法的int返回。

    我要做的第一件事就是缩小这个类的大小,使用整数数组作为一个恒定的比特流,它构成了数字的二进制表示。为了确保任何所需操作的正确性,这将需要更多的注意,但会节省大量的空间。如果您这样做,我还将存储一个变量来跟踪前导的0,或者可能是一个变量“total digits”语义。

    抱歉,这不是你问题的答案,但希望它能帮助你重新设计你的课程。

        3
  •  0
  •   Austin Salonen gmlacrosse    15 年前

    这个 BigInteger 在.NET 4.0中解决了您的上限要求。

    我认为您仍然需要这样的类来处理前导零的要求。

        4
  •  0
  •   Josh Stodola    15 年前

    直到 BigInteger 如果是公开可用的,我将使用一个公共字符串属性创建您自己的类/结构,以获取/设置初始数字(这将保持您的前导零)。然后具有一个只读属性,该属性分析字符串并返回 IntX 实例。