当我需要从数字本身的各个数字计算一个支票号码/数字时,我偶然发现了这个挑战。
E.g。我有一个数字(Int32
)423594340
,我想要一个像4,2,3,5,9,4,3,0
这样的整数集合。
我认为最好不要因为效果而将给定的int
转换为String
。
但你怎么做呢?
答案 0 :(得分:6)
我提出了个别困惑的解决方案。
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);
}
之后我在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;
}
}
当我不想考虑在方法(.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