整数到整数数组C#

我不得不将int“123456”的每个值拆分为Int [],我已经有了解决方案,但我不知道有没有更好的方法:我的解决方案是:

public static int[] intToArray(int num){ String holder = num.ToString(); int[] numbers = new int[Holder.ToString().Length]; for(int i=0;i<numbers.length;i++){ numbers[i] = Convert.toInt32(holder.CharAt(i)); } return numbers; } 

我相信这会比来回转换更好。 与JBSnorro的答案相反,我在转换为数组后反向,因此避免IEnumerable ,我认为这将有助于更快的代码。 此方法适用于非负数,因此0将返回new int[1] { 0 }

如果它应该适用于负数,你可以做一个n = Math.Abs(n)但我认为这没有意义。

此外,如果它应该更高性能,我可以创建最终数组,首先进行二元搜索,如if语句的组合,以确定数字的位数。

 public static int[] digitArr(int n) { if (n == 0) return new int[1] { 0 }; var digits = new List(); for (; n != 0; n /= 10) digits.Add(n % 10); var arr = digits.ToArray(); Array.Reverse(arr); return arr; } 

更新2018年:

 public static int numDigits(int n) { if (n < 0) { n = (n == Int32.MinValue) ? Int32.MaxValue : -n; } if (n < 10) return 1; if (n < 100) return 2; if (n < 1000) return 3; if (n < 10000) return 4; if (n < 100000) return 5; if (n < 1000000) return 6; if (n < 10000000) return 7; if (n < 100000000) return 8; if (n < 1000000000) return 9; return 10; } public static int[] digitArr2(int n) { var result = new int[numDigits(n)]; for (int i = result.Length - 1; i >= 0; i--) { result[i] = n % 10; n /= 10; } return result; } 

LINQ的简单解决方案

  int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray() 
 int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x); 

但如果你想将它转换为1,2,3,4,5:

 int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x - 48); 

使用从int到string和back的转换可能并不那么快。 我会使用以下内容

 public static int[] ToDigitArray(int i) { List result = new List(); while (i != 0) { result.Add(i % 10); i /= 10; } return result.Reverse().ToArray(); } 

我必须注意,这只适用于严格正整数。

编辑:

我提出了另一种选择。 如果性能真的是一个问题,这可能会更快,尽管你只能通过自己检查它的具体用法和应用程序来确定。

 public static int[] ToDigitArray(int n) { int[] result = new int[GetDigitArrayLength(n)]; for (int i = 0; i < result.Length; i++) { result[result.Length - i - 1] = n % 10; n /= 10; } return result; } private static int GetDigitArrayLength(int n) { if (n == 0) return 1; return 1 + (int)Math.Log10(n); } 

当n是非负时,这种方法有效。

你可以做到这一点,而无需将其转换为字符串并返回:

 public static int[] intToArray(int num) { List numbers = new List(); do { numbers.Insert(0, num % 10); num /= 10; } while (num > 0); return numbers.ToArray(); } 

当然,它仅适用于正值,但您的原始代码也有此限制。

 string DecimalToBase(int iDec, int numbase) { string strBin = ""; int[] result = new int[32]; int MaxBit = 32; for(; iDec > 0; iDec/=numbase) { int rem = iDec % numbase; result[--MaxBit] = rem; } for (int i=0;i= base10) strBin += cHexa[(int)result.GetValue(i)%base10]; else strBin += result.GetValue(i); strBin = strBin.TrimStart(new char[] {'0'}); return strBin; } int BaseToDecimal(string sBase, int numbase) { int dec = 0; int b; int iProduct=1; string sHexa = ""; if (numbase > base10) for (int i=0;i=0; i--,iProduct *= numbase) { string sValue = sBase[i].ToString(); if (sValue.IndexOfAny(cHexa) >=0) b=iHexaNumeric[sHexa.IndexOf(sBase[i])]; else b= (int) sBase[i] - asciiDiff; dec += (b * iProduct); } return dec; } 

我有类似的要求..我从许多好主意中获取,并添加了几个缺失的部分..许多人没有处理零或负值。 这就是我提出的:

  public static int[] DigitsFromInteger(int n) { int _n = Math.Abs(n); int length = ((int)Math.Log10(_n > 0 ? _n : 1)) + 1; int[] digits = new int[length]; for (int i = 0; i < length; i++) { digits[(length - i) - 1] = _n % 10 * ((i == (length - 1) && n < 0) ? -1 : 1); _n /= 10; } return digits; } 

我认为这很干净..虽然,我们正在进行条件检查和每次迭代的几次无关计算......虽然我认为在这种情况下它们是名义上的,但你可以通过这种方式进一步优化:

  public static int[] DigitsFromInteger(int n) { int _n = Math.Abs(n); int length = ((int)Math.Log10(_n > 0 ? _n : 1)) + 1; int[] digits = new int[length]; for (int i = 0; i < length; i++) { //digits[(length - i) - 1] = _n % 10 * ((i == (length - 1) && n < 0) ? -1 : 1); digits[(length - i) - 1] = _n % 10; _n /= 10; } if (n < 0) digits[0] *= -1; return digits; } 

我这样做:

 var result = new List(); while (num != 0) { result.Insert(0, num % 10); num = num / 10; } return result.ToArray(); 

性能稍差但可能更优雅的是:

 return num.ToString().Select(c => Convert.ToInt32(c.ToString())).ToArray(); 

请注意,这两者都返回1,2,3,4,5,6而不是49,50,51,52,53,54(即字符’1’,’2’,’3’,’的字节代码你的代码就是4’,’5’,’6’)。 我认为这是实际意图吗?

这是一个很好的解决方案,用于将整数转换为数组,即:int a = 5478 into int []如果你有一个字符串并且你想将一个字符串转换为整数数组,例如字符串str = 4561,则没有问题。 //转换成
arrays[0] = 4;
arrays[1] = 5;
arrays[2] = 6;
arrays[3] = 7;

注意:devider中的零(0)数等于输入长度,根据输入长度设置数组长度
现在检查编码:

  string str=4587; int value = Convert.ToInt32(str); int[] arr = new int[4]; int devider = 10000; for (int i = 0; i < str.Length; i++) { int m = 0; devider /= 10; arr[i] = value / devider; m = value / devider; value -= (m * devider); } 
  private static int[] ConvertIntToArray(int variable) { string converter = "" + variable; int[] convertedArray = new int[converter.Length]; for (int i=0; i < convertedArray.Length;i++) //it can be also converter.Length { convertedArray[i] = int.Parse(converter.Substring(i, 1)); } return convertedArray; } 

我们通过使用方法得到int。 然后,立即将其转换为string (123456 - >“123456”)。 我们有一个名为converter的字符串,并带有int值。 我们的字符串有一个string.Length ,特别是int长度,所以我们创建一个名为convertedArrayarray ,我们有长度,即converter( string )长度。 然后,我们进入循环,我们通过使用string.Substring(i,1)将字符串逐个转换为int,并赋值string.Substring(i,1) convertedArray[i] 。 然后,返回convertedArray 。在main或任何方法中,您可以轻松调用该方法。

感谢ASCII字符表 。 使用LINQ的简单答案产生答案+48。

 int[] result = youtInt.ToString().Select(o => Convert.ToInt32(o) - 48).ToArray(); 

要么

 int[] result = youtInt.ToString().Select(o => int.Parse(o.ToString())).ToArray(); 

可以使用