当我需要根据号码本身的各个数字计算支票号码/数字时,我偶然发现了这个挑战。
例如我有号码(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/