Подтвердить что ты не робот

Есть ли простой способ превратить int в массив ints каждой цифры?

Скажем, у меня

var i = 987654321;

Есть ли простой способ получить массив цифр, эквивалент

var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };

без .ToString() ing и итерации по символам с помощью int.Parse(x)?

4b9b3361

Ответ 1

public Stack<int> NumbersIn(int value)
{
    if (value == 0) return new Stack<int>();

    var numbers = NumbersIn(value / 10);

    numbers.Push(value % 10);

    return numbers;
}

var numbers = NumbersIn(987654321).ToArray();

Альтернатива без рекурсии:

public int[] NumbersIn(int value)
{
    var numbers = new Stack<int>();

    for(; value > 0; value /= 10)
        numbers.Push(value % 10);

    return numbers.ToArray();
}

Ответ 2

Я знаю, что есть, вероятно, лучшие ответы, чем это, но вот еще одна версия:

Вы можете использовать yield return, чтобы вернуть цифры в порядке возрастания (в зависимости от веса или того, что он вызывается).

public static IEnumerable<int> Digits(this int number)
{
    do
    {
        yield return number % 10;
        number /= 10;
    } while (number > 0);
}

12345 = > 5, 4, 3, 2, 1

Ответ 3

Другая альтернатива, которая не использует рекурсию и использует стек, который позволяет избежать перераспределения на каждую вставку (по крайней мере, для первых 32 цифр):

var list = new Stack<int>(32);
var remainder = 123456;
do
{
    list.Push(remainder % 10);
    remainder /= 10;
} while (remainder != 0);

return list.ToArray();

И да, этот метод также работает для 0 и отрицательных чисел.

Интересно, дайте этому алгоритму отрицательное число -123456, и вы получите {-1, -2, -3, -4, -5, -6}

Обновить: переход из списка в стек, так как это автоматически дает правильный порядок.

Ответ 4

var x = new Stack<int>();
do
{
    x.Push(i % 10);
    i /= 10;
} while (i > 0);
return x.ToArray();

Ответ 5

Вкратце: используйте цикл, который делит число по модулю 10 (%), чтобы получить напоминание (каждая цифра) и поместить его в массив.

Ответ 6

Строки и могут быть забавными (некоторые из других вариантов будут быстрее... но это довольно легко)

var @is = 987654321.ToString().Select(c => c - 48).ToArray();

Ответ 7

.NET 4.7.1 или выше:

IEnumerable<long> GetDigits(long value) =>
  value == 0 ? new long[0] : GetDigits(value / 10).Append(value % 10)

.NET 3.5 - 4.7:

IEnumerable<long> GetDigits(long value) =>
  value == 0 ? new long[0] : GetDigits(value / 10).Concat(new[] { value % 10 });

Ответ 8

Это преобразует в строку и перебирает символы, но делает это автоматически и в одну строку:

var i = 987654321;
var @is = i.ToString().Select(c => c - '0').ToArray();