Целое число с целым массивом 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 в строку и обратно, вероятно, происходит не так быстро. Я бы использовал следующие

 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 в int [] Нет проблем, если у вас есть строка, и вы хотите преобразовать String в целочисленный массив, например string str = 4561; //Конвертировать в
массив [0] = 4;
Массив [1] = 5;
Массив [2] = 6;
Массив [3] = 7;

Примечание. Число нhive (0) в devider равно длине ввода и задайте длину массива. Согласно вашей входной длине
Теперь проверьте кодировку:

  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 , особенно string.Length же длина int , мы создаем array именем string.Length , который имеет длину, то есть длину конвертера ( string ). Затем мы получаем в цикле, где мы преобразуем строку в int один за другим с помощью string.Substring(i,1) и присваиваем значение 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(); 

может быть использован