将 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的主要内容,如果未能解决你的问题,请参考以下文章

将多个 int 列/行合并为一个 numpy 数组(熊猫数据框)

java数组的合并问题

实现2个排好序的子序列合并

JAVA数组合并请高手指教

java中怎么合并两个数组 简单明了的

如何将两个有序数组合并为一个有序数组,用函数做,一个循环搞定?