【问题标题】:Is there a "Number" struct/class in .NET?.NET 中是否有“数字”结构/类?
【发布时间】:2010-01-29 21:55:11
【问题描述】:

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

.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();
    }
}

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

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

【问题讨论】:

  • 你不想要一个字符串吗?我看不到数字运算...
  • 如果你真的想要超过long 类型上限的东西,你需要重新考虑你的ToInt 方法。
  • 基本上是的,但是我想在类/结构级别强制无法使用非数字数据,并在代码中使用它的任何地方都明确表示这是意图。跨度>
  • 好点 Dan,但是添加它是为了支持一些存储为字符串并转换为 int 的值。绝对是凌乱的做事方式。 +1 指出这一点,需要在代码中添加注释警告。
  • 为什么需要前导数字?这是一个什么样的“数字”?我用引号说“数字”,因为在我看来,您真正存储的是代码,例如 SSN 或邮政编码或其他任何东西,实际上不是数字。它碰巧只被允许有数字并不会使它不再是一个代码。存储代码的正常方式是通过字符串。

标签: .net numbers base-class-library


【解决方案1】:

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

【讨论】:

  • 谢谢!肯定可以用,暂时需要依赖3.5,可以自己加代码处理前导零。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    .Net 4.0 中的BigInteger 满足您的上限要求。

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

    【讨论】:

    • 我确实注意到,在搜​​索是否已在 .NET 中实现 Int128 时,有人发布(然后删除)他们关于使用 long long 的评论。我想我可以在 .NET 4.0 中创建一个结构来保存 BigNumber 和一个“长度”值来确定填充时需要哪些前导零。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 2010-09-28
      相关资源
      最近更新 更多