Целое число с целым массивом С#
Мне пришлось разбивать 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;
}
Ответы
Ответ 1
Я считаю, что это будет лучше, чем конвертировать туда и обратно. В отличие от ответа 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<int>();
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;
}
Ответ 2
Простое решение с использованием LINQ
int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray()
Ответ 3
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);
Ответ 4
Использование преобразования из int в строку и обратно возможно не так быстро. Я бы использовал следующие
public static int[] ToDigitArray(int i)
{
List<int> result = new List<int>();
while (i != 0)
{
result.Add(i % 10);
i /= 10;
}
return result.Reverse().ToArray();
}
Мне нужно заметить, что это работает только для строго положительных целых чисел.
EDIT:
Я придумал альтернативу. Если производительность действительно является проблемой, это, вероятно, будет быстрее, хотя вы можете быть уверены, только проверив ее для вашего конкретного использования и приложения.
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 неотрицательно.
Ответ 5
Вы можете сделать это, не преобразовывая его в строку и обратно:
public static int[] intToArray(int num) {
List<int> numbers = new List<int>();
do {
numbers.Insert(0, num % 10);
num /= 10;
} while (num > 0);
return numbers.ToArray();
}
Он работает только для положительных значений, но ваш исходный код также имеет это ограничение.
Ответ 6
Я бы сделал это так:
var result = new List<int>();
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 '), как это делает ваш код. Я предполагаю, что это фактическое намерение?
Ответ 7
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<result.Length;i++)
if ((int)result.GetValue(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<cHexa.Length;i++)
sHexa += cHexa.GetValue(i).ToString();
for(int i=sBase.Length-1; 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;
}
Ответ 8
У меня было аналогичное требование. Я взял много хороших идей и добавил пару недостающих частей. Там, где многие люди не обращали нулевые или отрицательные значения. вот что я придумал:
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;
}
Ответ 9
Вот хорошее решение для преобразования вашего целого числа в массив, то есть: int a = 5478 в int [] Нет проблем, если у вас есть строка и вы хотите преобразовать строку в целочисленный массив, например string str = 4561; // Конвертировать в
массив [0] = 4;
Массив [1] = 5;
Массив [2] = 6;
Массив [3] = 7;
Примечание. Число ноль (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);
}
Ответ 10
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
так, мы создаем array
с именем convertedArray
, что мы имеем длину, то есть преобразователь (string
) длина. Затем мы попадаем в цикл, в котором по string.Substring(i,1)
преобразуем строку в int, используя string.Substring(i,1)
, и присваиваем значение string.Substring(i,1)
convertedArray[i]
. Затем верните convertedArray
.На main
или любой метод вы можете легко вызвать метод.
Ответ 11
Благодаря таблице символов 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();
может быть использован