Получите отдельные цифры от int в С#

Вопрос:

Я наткнулся на эту проблему, когда мне нужно было вычислить номер/цифру чека из отдельных цифр самого номера.

Например, у меня есть номер (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

Оцените статью
TechArks.Ru
Добавить комментарий