1

我正在尝试存储一个可变长度的数字,该数字可以有前导零作为该数字的一部分。

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

我目前将它们存储在这样的类中,如果 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

4 回答 4

2

我看到您的课程存在许多问题,应该通过重新设计来解决。

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

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

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

于 2010-01-29T22:18:53.210 回答
2

我建议看看这个关于 C# 中大整数的问题。您可以将它们扩展为前导零问题。

于 2010-01-29T22:10:16.223 回答
0

.Net 4.0 中的BigInteger解决了您的上限要求。

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

于 2010-01-29T22:05:41.837 回答
0

BigInteger公开可用之前,我将使用一个公共字符串属性创建您自己的类/结构来获取/设置初始数字(这将保持您的前导零)。然后有一个解析字符串并返回IntX实例的 ReadOnly 属性。

于 2010-01-29T22:19:03.333 回答