Скажем, у меня
var i = 987654321;
Есть ли простой способ получить массив цифр, эквивалент
var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
без .ToString()
ing и итерации по символам с помощью int.Parse(x)
?
Скажем, у меня
var i = 987654321;
Есть ли простой способ получить массив цифр, эквивалент
var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
без .ToString()
ing и итерации по символам с помощью int.Parse(x)
?
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();
}
Я знаю, что есть, вероятно, лучшие ответы, чем это, но вот еще одна версия:
Вы можете использовать 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
Другая альтернатива, которая не использует рекурсию и использует стек, который позволяет избежать перераспределения на каждую вставку (по крайней мере, для первых 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}
Обновить: переход из списка в стек, так как это автоматически дает правильный порядок.
var x = new Stack<int>();
do
{
x.Push(i % 10);
i /= 10;
} while (i > 0);
return x.ToArray();
Вкратце: используйте цикл, который делит число по модулю 10 (%), чтобы получить напоминание (каждая цифра) и поместить его в массив.
Строки и могут быть забавными (некоторые из других вариантов будут быстрее... но это довольно легко)
var @is = 987654321.ToString().Select(c => c - 48).ToArray();
.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 });
Это преобразует в строку и перебирает символы, но делает это автоматически и в одну строку:
var i = 987654321;
var @is = i.ToString().Select(c => c - '0').ToArray();