Есть ли в.NET структура / класс Number?

Я пытаюсь сохранить число переменной длины, которое может иметь начальные нули как часть этого числа.

Есть ли в платформе.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 ответа

Решение

Я бы посоветовал взглянуть на этот вопрос о больших целых числах в C#. Вы могли бы расширить их для ведущей проблемы нулей.

Я вижу ряд проблем с вашим классом, которые следует решить с помощью редизайна.

  • Ваш класс представляет значение и является изменчивым.
  • Конструктор, принимающий параметр массива int, только копирует ссылку.
  • Значение может быть больше, чем long, но возвращается как int из метода ToInt().

Первое, что я хотел бы сделать, чтобы уменьшить размер этого класса, это использовать массив целых чисел как постоянный поток битов, которые составляют двоичное представление вашего числа. Это потребует гораздо большего внимания для обеспечения правильности любых желаемых операций, но сэкономит вам значительное количество места. Если вы сделаете это, я бы также сохранил переменную для отслеживания ведущих нулей или, возможно, семантику переменной "общее количество цифр".

Извините, это не ответ на ваш вопрос, но, надеюсь, это поможет вам изменить дизайн вашего класса.

BigInteger в.Net 4.0 отвечает вашим требованиям к верхнему пределу.

Я думаю, что вам все еще нужен такой класс, чтобы справиться с вашими требованиями к нулям.

Пока BigInteger не будет открыто доступен, я бы создал свой собственный класс / структуру с одним общедоступным строковым свойством, чтобы получить / установить начальное число (это будет поддерживать ваши ведущие нули). Затем имейте свойство ReadOnly, которое анализирует строку и возвращает экземпляр IntX.

Другие вопросы по тегам