c# - 在 C# 中从 int 中获取单独的数字

标签 c# .net 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:使用 Linq 的 .Reverse() 取模

之后,我在互联网上探索了其他解决方案,并发现了 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:使用堆栈的 LIFO 进行取模

当我不想在方法 (GetDigits2(int source)) 之后调用 .Revers() 时,我还能做什么?因此,我在方法内使用一个变量,在该变量上调用 .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 的 .Reverse() 取模

2'252'875 ticks

#3:使用堆栈的 LIFO 进行取模

23'626'839 ticks
<小时/>

tl;博士

fiddle 来了:Get Digits from int

关于c# - 在 C# 中从 int 中获取单独的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45508659/

相关文章:

c# - 结构映射方法 Populate() 不适用于 ASP.NET Core

c# - Xamarin 按钮点击处理异常

java - 表达式开始非法 public int getInput

.net - 比较小数的最佳方法是什么?

c# - Excel RoundUp 与 .NET Math.Round

c# - 完全在代码隐藏中创建 DataGrid 列工具提示

.net - 基于多人回合的 silverlight 游戏的服务器端

.net - 有人可以简单解释一下如何使用 Threading.MemoryBarrier 在 .Net 中实现 'Full Fences' 吗?

c# - 命名空间 'DataSetExtensions' 中不存在类型或命名空间名称 'System.Data'(是否缺少程序集引用?)

java - 如何在java中输出无符号整数的绝对值