整数到整数数组C#

时间:2011-01-02 20:10:08

标签: c# arrays int

我不得不将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;
}

15 个答案:

答案 0 :(得分:24)

使用LINQ

的简单解决方案
 int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray()

答案 1 :(得分:17)

我相信这会比来回转换更好。与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 :(得分:11)

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);

答案 3 :(得分:5)

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

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();
}

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

编辑:

我提出了另一种选择。如果性能确实存在问题,这可能会更快,尽管您只能通过自己检查它的具体用途和应用来确定。

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为非负时,这是有效的。

答案 4 :(得分:2)

我会这样做:

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')就像你的代码一样。我认为这是实际意图吗?

答案 5 :(得分:1)

您可以在不将其转换为字符串并返回的情况下执行此操作:

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 :(得分:1)

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; 
        }

答案 7 :(得分:1)

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

    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;
    }

答案 8 :(得分:1)

我将按照以下方式进行转换

if (num == 0)  return new int[1] { 0 };           
var digits = new List<int>();
while (num > 0)
{
   digits.Add(num % 10);
   num /= 10;
}
 var arr = digits.ToArray().Reverse().ToArray();

答案 9 :(得分:0)

这是将整数转换为数组的良好解决方案,即: int a = 5478 into int [] 如果您有一个字符串并且您想要将String转换为整数数组,则没有问题 string str = 4561; //转换为
阵列[0] = 4;
阵列[1] = 5;
阵列[2] = 6;
阵列[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);
            }

答案 10 :(得分:0)

 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-&gt;“123456”)。我们有一个名为converter的字符串,其值为int。我们的字符串有string.Length,特别是int的长度相同,因此,我们创建了一个名为array的{​​{1}}我们有长度,即转换器convertedArray ) 长度。然后,我们进入循环,我们通过使用string将字符串逐个转换为int,并赋值string.Substring(i,1)。然后,返回convertedArray[i]。在convertedArray或任何方法,您都可以轻松调用该方法。

答案 11 :(得分:0)

感谢ASCII character table。使用LINQ above的简单答案将得到答案+ 48。

要么

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

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

可以使用

答案 12 :(得分:0)

public static int[] intToArray(int num)
{
    num = Math.Abs(num);
    int length = num.ToString().Length;
    int[] arr = new int[length];
    do
    {
        arr[--length] = num % 10;
        num /= 10;
    } while (num != 0);

    return arr;
}

按系统基数除法(在这种情况下为十进制)将除去最右边的数字,然后由余数运算符得到该数字。我们一直重复,直到最终为零。每次删除数字时,它将从数组的末尾开始并向后存储在数组中,以避免需要在末尾重新检查数组。 Math.Abs​​()函数用于处理负输入,该数组也以与输入长度相同的大小实例化。

答案 13 :(得分:0)

整数或长整数数组C# 将其转换为char数组并减去48。

 public static int[] IntToArray(int value, int length)
    {
        char[] charArray = new char[length];
        charArray = value.ToString().ToCharArray();
        int[] intArray = new int[length];
        for (int i = 0; i < intArray.Length; i++)
        {
            intArray[i] = charArray[i] - 48;
        }

        return intArray;
    }

    public static int[] LongToIntArray(long value, int length)
    {
        char[] charArray = new char[length];
        charArray = value.ToString().ToCharArray();
        int[] intArray = new int[length];
        for (int i = 0; i < intArray.Length; i++)
        {
            intArray[i] = charArray[i] - 48;
        }

        return intArray;
    }

答案 14 :(得分:0)

MarkXA 的单行版本的更简洁的方法:

int[] result = n.ToString().Select(c => (int)Char.GetNumericValue(c)).ToArray();

GetNumericValue 以双精度形式返回字符中的可见数字,因此如果您的字符串是“12345”,它将返回双精度 1、2、3、4、5,每个都可以转换为整数。请注意,在 C# 中的字符上使用 Convert.ToInt32 会返回 ASCII 代码,因此您将获得 49,50,51,52,53。这可以理解地导致错误。