Integer to Integer Array C#

前端 未结 14 1549
深忆病人
深忆病人 2020-12-08 04:42

I had to split an int \"123456\" each value of it to an Int[] and i have already a Solution but i dont know is there any better way : My solution was :

publi         


        
相关标签:
14条回答
  • 2020-12-08 05:31

    Using conversion from int to string and back probably isn't that fast. I would use the following

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

    I do have to note that this only works for strictly positive integers.

    EDIT:

    I came up with an alternative. If performance really is an issue, this will probably be faster, although you can only be sure by checking it yourself for your specific usage and application.

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

    This works when n is nonnegative.

    0 讨论(0)
  • 2020-12-08 05:31

    I would convert it in the below manner

    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();
    
    
    0 讨论(0)
  • 2020-12-08 05:34

    I'd do it like this:

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

    Slightly less performant but possibly more elegant is:

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

    Note that these both return 1,2,3,4,5,6 rather than 49,50,51,52,53,54 (i.e. the byte codes for the characters '1','2','3','4','5','6') as your code does. I assume this is the actual intent?

    0 讨论(0)
  • 2020-12-08 05:39

    A simple solution using LINQ

     int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray()
    
    0 讨论(0)
  • 2020-12-08 05:39

    Thanks to ASCII character table. The simple answer using LINQ above yields answer + 48.

    Either

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

    or

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

    can be used

    0 讨论(0)
  • 2020-12-08 05:40
    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;
    }
    

    Dividing by system base (decimal in this case) removes the right most digit, and we get that digit by remainder operator. We keep repeating until we end up with a zero. Each time a digit is removed it will be stored in an array starting from the end of the array and backward to avoid the need of revering the array at the end. The Math.Abs() function is to handle the negative input, also the array is instantiated with the same size as input length.

    0 讨论(0)
提交回复
热议问题