【发布时间】:2021-02-01 09:07:48
【问题描述】:
我怎样才能转换一个long,例如:
123456789123456789
进入:
[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]
我问是因为我需要一种方法来遍历升 C 中的 Long,但 Long 显然不使用 [ ] 用于数组,所以我似乎无法访问每个数字。
【问题讨论】:
标签: c# arrays types long-integer
我怎样才能转换一个long,例如:
123456789123456789
进入:
[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]
我问是因为我需要一种方法来遍历升 C 中的 Long,但 Long 显然不使用 [ ] 用于数组,所以我似乎无法访问每个数字。
【问题讨论】:
标签: c# arrays types long-integer
这很粗略,但你可以将 long 转换为字符串,然后将其分解为单个数字,然后将它们转换回像这样的整数
var digits = 123456789123456789L.ToString().Select(d => int.Parse(d.ToString()));
要将数组转换回长整数,您可以这样做
var longFromDigits = digits.Aggregate(0L, (s, d) => s * 10 + d);
【讨论】:
long result = long.Parse(string.Concat(digits));:这里我们将所有数字连接到string,然后我们将其解析为long
如果您不想使用 strings 进行操作,您可以在模运算的帮助下循环数字:
public static int[] Digits(long value) {
if (value == 0)
return new int[] { 0 };
List<int> result = new List<int>();
for (; value != 0; value /= 10)
result.Add((int)Math.Abs(value % 10));
result.Reverse();
return result.ToArray();
}
然后
int[] digits = Digits(123456789123456789L);
编辑:您所要做的就是Aggregate digits 让long 回复:
int[] digits = new [] { 1, 2, 3};
long result = digits.Aggregate(0L, (s, a) => s * 10 + a);
【讨论】:
while (num != 0) { result.Insert(0, num % 10); num = num / 10; }
result.Insert(0, ...) 耗时:我们必须移动整个集合,而 Add 后跟最终的 Reverse在大量数据上要快得多(当然不是在这里)。这是我的习惯:更长的代码,但我相信它不会背叛我。 Math.Abs 相同,value == 0 时的特殊情况