Есть ли простой способ превратить int в массив целых чисел каждой цифры? - PullRequest
13 голосов
/ 06 мая 2009

Скажите, у меня есть

var i = 987654321;

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

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

без .ToString() ввода и перебора символов с int.Parse(x)?

Ответы [ 8 ]

24 голосов
/ 06 мая 2009
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();
}
15 голосов
/ 06 мая 2009

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

Вы можете использовать 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

5 голосов
/ 06 мая 2009

Другая альтернатива, которая не использует рекурсию и использует стек, который избегает перераспределения при каждой вставке (по крайней мере, для первых 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}

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

4 голосов
/ 06 мая 2009
var x = new Stack<int>();
do
{
    x.Push(i % 10);
    i /= 10;
} while (i > 0);
return x.ToArray();
2 голосов
/ 06 мая 2009

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

1 голос
/ 13 мая 2010

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

var @is = 987654321.ToString().Select(c => c - 48).ToArray();
0 голосов
/ 03 февраля 2019

.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 });
0 голосов
/ 06 мая 2009

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

var i = 987654321;
var @is = i.ToString().Select(c => c - '0').ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...