从C#中获取单独的数字

时间:2017-08-04 13:53:49

标签: c# .net int

当我需要从数字本身的各个数字计算一个支票号码/数字时,我偶然发现了这个挑战。

E.g。我有一个数字(Int32423594340,我想要一个像4,2,3,5,9,4,3,0这样的整数集合。

我认为最好不要因为效果而将给定的int转换为String但你怎么做呢?

1 个答案:

答案 0 :(得分:6)

我提出了个别困惑的解决方案。

#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:使用Linq的模数。反向()

之后我在Internet上探索了其他解决方案,我遇到了Java人员中的一个:How to get the separate digits of an int number?

缺点是集合中的整数顺序是相反的。这是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:使用Stack的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;
}

测试

我测试了每种方法1000万次并测量了测试开始和结束之间的滴答数量。

#1:拥有创建的方法

1'549'084 ticks

#2:使用Linq&#39;的模数。反向()

2'252'875 ticks

#3:使用Stack的LIFO模块

23'626'839 ticks

<强> TL;博士

这是小提琴:Get Digits from int