Есть ли в .NET структура / класс Number? - PullRequest
1 голос
/ 30 января 2010

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

Существует ли в платформе .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 ]

2 голосов
/ 30 января 2010

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

2 голосов
/ 30 января 2010

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

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

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

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

0 голосов
/ 30 января 2010

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

0 голосов
/ 30 января 2010

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

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

...