2010-06-14 15 views
6

Esto es un poco extraño caso, debo admitir, pero estoy tratando de encontrar una forma concisa y elegante de convertir un List<int> en un int real. Por ejemplo, si mi lista contuviera las entradas 1, 2 y 3, entonces el entero final sería 123. La única otra forma en que pensé hacerlo fue convirtiendo la matriz en una cadena y luego analizando la cadena.Convertir la lista Int en entero

¿Alguna pista?

+0

Mira que el contenido de la lista deben producir un int válidos (es decir, un entero en el rango -2,147,483,648 hasta +2,147,483,647). – Humberto

+1

Además, ¿qué pasaría si su lista es algo así como {100, 1, 0, 2}? – Humberto

+0

¿Cuál es la regla si su lista contiene valores> = 10? p.ej. ¿1, 20, 33, 4 se convertirían en 120334? Si es así, las "respuestas de múltiplos de 10" a continuación fallarán. –

Respuesta

14

Iterate la lista, como si sumaras una suma, pero multiplica el total acumulado por 10 en cada etapa.

int total = 0; 
foreach (int entry in list) 
{ 
    total = 10 * total + entry; 
} 
+3

¿Qué pasa si las entradas no son de un solo dígito? Digamos: {1,3,15} Resultado esperado: 1,315 Resultado real: 145 – RonK

+0

@RonK. Es cierto, lleva el dígito extra. El problema fue presentado con un solo dígito, para lo cual funciona, pero aquí se necesita más claridad sobre el resultado deseado. –

+0

RonK manchado bien, en cualquier otro caso esto sería cierto.Para mí no es como estoy iterando sobre una matriz de caracteres, así que creo que esto funcionará. Lo probaré después del almuerzo. – Kezzer

1

Creo que la sugerencia es bastante bueno, algo así como esto funciona:

var list = new List<int>() { 1, 2, 3, 4 }; 
var listAsString = String.Join("", list.ConvertAll(x => x.ToString()).ToArray()); 
Console.WriteLine(listAsString); 
int result = Int32.Parse(listAsString); 
Console.WriteLine(result); 
+0

dangit me pegó al golpe. – Will

2
List<int> l = new List<int>(); 
// add numbers 
int result = int.Parse(string.Join(",", l).Replace(",", "")) 

Habría que tener cuidado si la lista es lo suficientemente largo para que el número resultante superaría los límites para un int sin embargo.

+1

¿No podría simplemente hacer 'int.Parse (string.Join (" ", l))'? – Kezzer

0

Puede hacerlo agregando todos los números en un bucle. No estoy seguro de que es más rápido que el análisis de cadenas sin embargo:

List<int> list = new List<int> {1, 2, 3}; 
int sum = 0; 
int pow = list.Count - 1; 
for (int i = 0; i <= pow; i++) 
{ 
    sum += list[i] * (int)Math.Pow(10,(pow-i)); 
} 

También si usted tiene una larga lista, es posible que desee utilizar la clase BigInteger de .Net 4 en lugar de un int.

0

Bueno solo por diversión (no tengo ni idea de lo eficiente que es, probablemente no muy), también se puede hacer esto fácilmente con LINQ ...

primero convertir la lista de enteros a una lista de cadenas, luego use la función de agregado para concatenarlos, luego, al final, use in32.TryParse para asegurarse de que el valor resultante esté en el rango int.

string val = ints.Select(i=> i.ToString()).Aggregate((s1, s2) => s1 + s2); 
0

Diga, usted tiene una enumerable como

var digits = [1, 2, 3 ...]; 

entonces usted podría hacer:

// simplest and correct way; essentially the accepted answer but using LINQ 
var number = digits.Aggregate((a, b) => a * 10 + b); 

// string manipulation; works for sets like [10, 20, 30] 
var number = int.Parse(string.Join("", digits)); 

// using `Select` instead of `Aggregate` but verbose; not very useful 
var number = (int)digits.Select((d, i) => d * Math.Pow(10, digits.Count() - i - 1)).Sum();