整数到整数数组C#

Bur*_*imi 19 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;
}
Run Code Online (Sandbox Code Playgroud)

Jah*_*ine 26

一个简单的解决方案 LINQ

 int[] result = yourInt.ToString().Select(o=> Convert.ToInt32(o)).ToArray()
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的,请检查下面的 MarkXA 答案,因为上面返回的是字符的字节码而不是数字本身。 (12认同)

Las*_*olt 19

我相信这会比来回转换更好.与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;
}
Run Code Online (Sandbox Code Playgroud)

更新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;
}
Run Code Online (Sandbox Code Playgroud)


Sae*_*iri 12

int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x);
Run Code Online (Sandbox Code Playgroud)

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

int[] outarry = Array.ConvertAll(num.ToString().ToArray(), x=>(int)x - 48);
Run Code Online (Sandbox Code Playgroud)


Mar*_*kXA 9

我会这样做:

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

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

return num.ToString().Select(c => Convert.ToInt32(c.ToString())).ToArray();
Run Code Online (Sandbox Code Playgroud)

请注意,这些都返回 1,2,3,4,5,6 而不是 49,50,51,52,53,54(即字符 '1','2','3',' 的字节码4','5','6') 就像您的代码一样。我认为这是实际意图?


JBS*_*rro 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();
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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