Вопрос:
Я наткнулся на эту проблему, когда мне нужно было вычислить номер/цифру чека из отдельных цифр самого номера.
Например, у меня есть номер (Int32) 423594340 и я хочу набор целых чисел, таких как 4,2,3,5,9,4,3,0.
Я думаю, что лучше не преобразовывать заданный int в String из-за производительности. Но как вы это делаете?
Лучший ответ:
Я придумал индивидуальное озадаченное решение.
Содержание
- # 1: Собственное созданное решение
- # 2: Modulo с Linq.Reverse()
- # 3: Modulo со стеком LIFO
- тестирование
# 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