Добавление '0' с использованием concat не работает - PullRequest
0 голосов
/ 14 марта 2020

У меня есть программа, которая сравнивает длину двух целочисленных значений с этим методом расширения

public static int NumDigits(this int n)
{
    if (n < 0)
    {
        n = (n == int.MinValue) ? int.MaxValue : -n;
    }
    if (n < 10) return 1;
    if (n < 100) return 2;
    if (n < 1000) return 3;
    if (n < 10000) return 4;
    if (n < 100000) return 5;
    if (n < 1000000) return 6;
    if (n < 10000000) return 7;
    if (n < 100000000) return 8;
    return n < 1000000000 ? 9 : 10;
}

И она отлично работает. Когда я печатаю значение num1.numDigits(), оно возвращает 4 (оно стоит «1111». И другое целое число: num2.numDigits() возвращает 2 (это 11). Это здорово, но когда я на самом деле сравниваю их:

int[] rawNum2 = Arrays.DigitArr(num2);

if (num1.NumDigits() > num2.NumDigits())
{
    int diff = num1.NumDigits() - num2.NumDigits();
    for (int i = 1; i < diff; i++)
    {
        rawNum2.Append(0);
    }

    reversedNum2 = rawNum2.Reverse();

}

reversedNum2 по-прежнему равен 11, когда он должен быть 0011.

Это класс, который я скомпилировал и использовал.

public static int[] Append(this int[] source, int value)
{
    int[] newValue = source;
    newValue = newValue.Concat(new[] { value }).ToArray();
    return newValue;
}

public static int[] Reverse(this int[] array)
{
    int[] arr = array;
    for (int i = 0; i < arr.Length / 2; i++)
    {
      int tmp = arr[i];
      arr[i] = arr[arr.Length - i - 1];
      arr[arr.Length - i - 1] = tmp;
    }

    return arr;
}

public static int[] DigitArr(int n)
{
    if (n == 0) return new int[1] { 0 };

    var digits = new List<int>();
    for (; n != 0; n /= 10)
        digits.Add(n % 10);

    var arr = digits.ToArray();
    Array.Reverse(arr);
    return arr;
}

Почему это происходит?

Ответы [ 3 ]

4 голосов
/ 14 марта 2020

Вы отбрасываете возвращаемое значение метода Append. Измените

rawNum2.Append(0);

на

rawNum2 = rawNum2.Append(0);

внутри for l oop.

1 голос
/ 14 марта 2020

Ваш l oop может быть и должен быть упрощен до:

rawNum2 = rawNum2.PadRight(num1.NumDigits(), '0')
0 голосов
/ 14 марта 2020

Чтобы получить значение reversedNum2 как 0011, измените значение l oop, как показано ниже.

for (int i = 1; i <= diff; i++)
{
rawNum2=rawNum2.Append(0);
}

Я сделал два изменения, изменив для l oop использование i <= diff вместо i <diff ​​и присвоение возвращаемого значения из метода Append () в rawNum2. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...