2009-05-06 13 views
11

Decir que tengo¿Hay alguna manera fácil de convertir un int en una matriz de entradas de cada dígito?

var i = 987654321; 

¿Hay una manera fácil de conseguir una gran variedad de los dígitos, el equivalente a

var is = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 

sin .ToString() ING y iterar sobre los caracteres con int.Parse(x)?

+2

Por curiosidad: ¿Para qué serviría eso? – Tomalak

+0

¿Por qué "sin iterar sobre los caracteres"? – Kamarey

+0

me pegó, jeje –

Respuesta

21
public Stack<int> NumbersIn(int value) 
{ 
    if (value == 0) return new Stack<int>(); 

    var numbers = NumbersIn(value/10); 

    numbers.Push(value % 10); 

    return numbers; 
} 

var numbers = NumbersIn(987654321).ToArray(); 

Alternativa sin recursión:

public int[] NumbersIn(int value) 
{ 
    var numbers = new Stack<int>(); 

    for(; value > 0; value /= 10) 
     numbers.Push(value % 10); 

    return numbers.ToArray(); 
} 
+0

Convierta la lista a una matriz agregando .ToArray() – Scoregraphic

+0

Estaba haciendo eso como me comentó :) –

+0

Preferencia personal de utilizar el bucle for en lugar de un do-while en el estuche Alguien se pregunta. –

2

En resumen: utilizar bucle que dividen número modulo 10 (%) para obtener recordatorio (cada dígito) y ponerlo en array.

4
var x = new Stack<int>(); 
do 
{ 
    x.Push(i % 10); 
    i /= 10; 
} while (i > 0); 
return x.ToArray(); 
+1

* tos * en una serie de inyecciones * tos * –

+0

Gracias. Lo actualicé para que parezca menos tonto :-) – marklam

5

Otra alternativa que no haga utiliza la recursividad y utiliza una pila que evita reasignación en cada inserción (al menos para los primeros 32 dígitos):

var list = new Stack<int>(32); 
var remainder = 123456; 
do 
{ 
    list.Push(remainder % 10); 
    remainder /= 10; 
} while (remainder != 0); 

return list.ToArray(); 

Y sí, este método también funciona para 0 y números negativos.

Curiosamente, este algoritmo da un número negativo -123456 y obtendrá {-1, -2, -3, -4, -5, -6}

actualización: pasado de utilizar la lista de Apila ya que esto da automáticamente el orden correcto.

+0

Gracias por el ... recordatorio, @Tomalak –

+0

Lo eliminé ya. +1 de todos modos. – Tomalak

-2

Esto convierte a la cadena y iterar sobre los personajes, pero lo hace una especie de forma automática y en una sola línea:

var i = 987654321; 
var is = i.ToString().Cast<int>().ToArray(); 
+3

Esto no funciona. Primero, obtendrá una InvalidCastException. Segundo, int x = (int) '1'; no produce el valor 1, pero el valor Unicode para el carácter '1' que es 49. –

+3

Y no puede usar "es" como nombre de variable;) –

11

Sé que hay probablemente mejores respuestas que esto, pero aquí es otra versión:

Puede usar yield return para devolver los dígitos en orden ascendente (de acuerdo con el peso, o como se llame).

public static IEnumerable<int> Digits(this int number) 
{ 
    do 
    { 
     yield return number % 10; 
     number /= 10; 
    } while (number > 0); 
} 

12345 => 5, 4, 3, 2, 1

+0

siempre me gusta un buen ejemplo de rendimiento, tengo +1 –

+0

yo también , es por eso que no pude resistir! – Svish

1

Cuerdas y puede divertirse (algunas de las otras opciones sería más rápido ... pero esto es bastante fácil)

var @is = 987654321.ToString().Select(c => c - 48).ToArray(); 
Cuestiones relacionadas