Я наткнулся на эту проблему, когда мне нужно было вычислить номер/цифру чека из отдельных цифр самого номера.
Например, у меня есть номер (Int32
) 423594340
и я хочу набор целых чисел, таких как 4,2,3,5,9,4,3,0
.
Я думаю, что лучше не преобразовывать заданный int
в String
из-за производительности. Но как вы это делаете?
Я придумал индивидуальное озадаченное решение.
# 1: Собственное созданное решение
public static IEnumerable<int> GetDigits(int source)
{
int individualFactor = 0;
int tennerFactor = Convert.ToInt32(Math.Pow(10, source.ToString().Length));
do
{
source -= tennerFactor * individualFactor;
tennerFactor /= 10;
individualFactor = source / tennerFactor;
yield return individualFactor;
} while (tennerFactor > 1);
}
# 2: Modulo с Linq.Reverse()
После этого я исследовал Интернет для других решений, и я наткнулся на одного из людей Java: как получить отдельные цифры номера int?
Недостатком является то, что порядок целых чисел в коллекции меняется на противоположный. Здесь идет Microsoft Linq.
Как вызвать метод с .Reverse()
.
...
GetDigits2(input).Reverse()
...
И фактический метод.
public static IEnumerable<int> GetDigits2(int source)
{
while (source > 0)
{
var digit = source % 10;
source /= 10;
yield return digit;
}
}
# 3: Modulo со стеком LIFO
Что еще я мог сделать, когда не хочу думать о вызове .Revers()
после метода (GetDigits2(int source)
)? Поэтому я использую переменную внутри метода, вызываю.Reverse() для переменной и возвращаю ее результат.
Или что-то совершенно другое: я помню логику LIFO. В.NET вы используете для этого класс Stack.
public static IEnumerable<int> GetDigits3(int source)
{
Stack<int> digits = new Stack<int>();
while (source > 0)
{
var digit = source % 10;
source /= 10;
digits.Push(digit);
}
return digits;
}
тестирование
Я тестировал каждый метод 10 миллионов раз и измерял количество тиков между началом и концом теста.
# 1: собственный метод создания
1'549'084 ticks
# 2: Modulo с Linq.Reverse()
2'252'875 ticks
# 3: Modulo со стеком LIFO
23'626'839 ticks
ТЛ; др
Здесь идет скрипка: Получить цифры из int