将 int 数组合并为单个 int
Posted
技术标签:
【中文标题】将 int 数组合并为单个 int【英文标题】:Combine int array to a single int 【发布时间】:2018-12-14 09:06:30 【问题描述】:我想将一个整数数组组合成一个整数值。所以我有以下代码将数组组合成一个值。
int[] array = 5, 6, 2, 4 ;
int combine = 0;
for (int i = 0; i < array.Length; i++)
combine += array[i] * Convert.ToInt32(Math.Pow(10, array.Length-i-1));
这个产量组合 = 5624。这是正确的。
我的问题是我的数组不是 0-9 的形式。所以我的数组可能是 51,62,23,44
int[] array = 51, 62, 23, 44 ;
int combine = 0;
for (int i = 0; i < array.Length; i++)
combine += array[i] * Convert.ToInt32(Math.Pow(10, array.Length-i-1));
产生组合为 574774,而不是 51622344。我该如何纠正这个问题?
【问题讨论】:
将每个元素转换为字符串,连接字符串,然后将结果转换回Int32
。
为什么不将它们转换成字符串然后连接起来呢?
C# List<string> to string with delimiter的可能重复
@JayV:不够接近。
谢谢大家。我不知道为什么我没有想到这么简单的解决方法。
【参考方案1】:
执行以下操作:
var number = int.Parse(string.Join("", array));
解释:
string.Join
将采用 T
类型的任何枚举,对每个成员调用 ToString()
并将它们加入一个带有指定分隔符的字符串中。
一旦你有一个字符串代表你的号码,你只需解析它来获取号码本身。
当然这是不安全的,根据您可能的输入,这可能会失败:1, 4, -5, 4
。一些错误检测和int.TryParse
可能是解决这个问题的最好方法,这个例子只是为了让大家了解这个想法。
【讨论】:
var number = int.Parse(string.Concat(array));
@Eser 是的,我经常使用Join
,所以我最终总是使用它。 Concat
可能更正确,这是一个坏习惯。【参考方案2】:
为什么不将它们转换为字符串然后连接起来?
using System;
public class Program
public static void Main()
int[] intArray = 5, 6, 2, 4 ;
var result = string.Concat(intArray);
Console.WriteLine(result);
try
int resultNumber = int.Parse(result);
catch(OverflowException)
// this can occur if you exceed the maximum value of an int
long resultBigNumber = long.Parse(result);
【讨论】:
在catch
块中定义不同类型的结果并不是最好的主意。
@RobertHarvey - 是的,但我不确定最终值将如何使用。如果仅显示,则根本不需要解析,并且可以完全忽略整个 try/catch。我想关于意图仍然存在一些问题。【参考方案3】:
尝试使用 StringBuilder,如下所示:
using System;
using System.Text;
public class Program
public static void Main(string[] args)
StringBuilder sb = new StringBuilder();
int[] array = new Int[] 51, 62, 23, 44 ;
int combine = 0;
foreach(int single in array)
string oneNum = single.ToString();
sb.Append(oneNum);
string final = sb.ToString();
combine = Convert.ToInt32(final);
这会将数组中的数字转换为字符串,然后再转换为数字。
【讨论】:
【参考方案4】:Linq 和一些简单的数学可以在这里提供帮助(无需字符串或 Math.Pow)。我还将用大小差异很大的数字来播种它(即,不是所有个位数或所有两位数)。首先是一些初步的代码:
private readonly int[] PowersOf10 = new [] 10, 100, 1000, 10000, 100000;
private int DecimalShiftAccumulate(int numToShift, int numToAdd)
var nextPowerOf10 = PowersOf10.First(x => x > numToAdd);
return (numToShift * nextPowerOf10) + numToAdd;
您可以在 PowersOf10 数组中包含更多数字;我厌倦了数零。
然后声明你的 int 数组并计算结果:
var intArray = new[] 1051, 7, 923, 44 ;
var arrayResult = intArray.Aggregate((a, b) => DecimalShiftAccumulate(a, b));
我得到 arrayesult = 1051792344
(即(使用 & 作为连接)1051 & 7 & 923 & 44)
【讨论】:
以上是关于将 int 数组合并为单个 int的主要内容,如果未能解决你的问题,请参考以下文章