2011-06-01 19 views
114

Mi pregunta es parte de este problema:Cómo convertir la lista <string> en la lista <int>?

Recibo una colección de identificadores de un formulario. Necesito obtener las claves, convertirlas en enteros y seleccionar los registros coincidentes de la base de datos.

[HttpPost] 
public ActionResult Report(FormCollection collection) 
{ 
    var listofIDs = collection.AllKeys.ToList(); 
    // List<string> to List<int> 
    List<Dinner> dinners = new List<Dinner>(); 
    dinners= repository.GetDinners(listofIDs); 
    return View(dinners); 
} 

Respuesta

270
listofIDs.Select(int.Parse).ToList() 
+0

Excepción levantada: LINQ to Entities no reconoce el método 'Int32 IndexOf (Char)', y este método no se puede traducir a una expresión de tienda. .net 4.0 – markthewizard1234

+1

@ markthewizard1234 Eso sucederá si su 'listofIDs' es un' IQueryable 'que no se ha ejecutado. Ejecutarlo primero con 'ToList()' antes de hacer la conversión: 'listofIDs.ToList(). Seleccionar (int.Parse) .ToList()' –

+1

no funcionó para mí – fnc12

31

Usando LINQ ...

List<string> listofIDs = collection.AllKeys.ToList(); 
List<int> myStringList = listofIDs.Select(s => int.Parse(s)).ToList(); 
10

Usando LINQ:

var intList = stringList.Select(s => Convert.ToInt32(s)).ToList() 
0

Ésta es la manera más simple, pienso:

var listOfStrings = (new [] { "4", "5", "6" }).ToList(); 
var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q)); 
+5

Veo este tipo de patrón en expresiones lambda a menudo: _x => someMethod (x) _. Sabes que probablemente deberías reemplazar eso con _someMethod_. Con eso, su ejemplo se convierte en _listOfStrings.Select (Convert.ToInt32); _. Eso es probablemente más legible, más rápido, más corto y ¿ya mencioné más elegante? Lo mismo aplica para todos los demás que responden esta pregunta. – JBSnorro

+0

Recibo un error al omitir la sintaxis de flecha. Esto funciona: 'Lista sss = nueva lista ();' 'IEnumerable test1 = sss.Select (x => Convert.ToInt32 (x));' pero esto no es así: 'IEnumerable test2 = sss.Select (Convert.ToInt32); 'El error es una llamada ambigua entre las versiones' string, int, int' y 'string, int' de Select. – goodeye

-1
public List<int> ConvertStringListToIntList(List<string> list) 
    { 
    List<int> resultList = new List<int>(); 
    for (int i = 0; i < list.Count; i++) 
     resultList.Add(Convert.ToInt32(list[i])); 

    return resultList; 
    } 
+3

Considere agregar alguna explicación textual sobre su respuesta, en lugar de solo proporcionar código. – carlosfigueira

-2
list<int> integersList = decimalList.cast<int>().ToList() 

if nullable type then place place '?' por delante de su tipo, como

list<int?> integersList = decimalList.cast<int?>().ToList() 
+2

Tiene una lista de cadenas, no se pueden convertir a int. – Vache

3

Sé que es antiguo puesto, pero pensé que esto es una buena adición: Puede utilizar List<T>.ConvertAll<TOutput>

List<int> integers = strings.ConvertAll(s => Int32.Parse(s)); 
4

Aquí es una variante segura que filtra enteros válidos:

List<int> ints = strings 
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null) 
    .Where(n => n.HasValue) 
    .Select(n => n.Value) 
    .ToList(); 

utiliza el nuevo out variables introducidas con C# 7.0.

Esta otra variante devuelve una lista de enteros con valores nulos en los que se insertan null entradas para los enteros válidos (es decir, que conserva el recuento lista original):

List<int?> nullableInts = strings 
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null) 
    .ToList(); 
+0

¡Buena respuesta! No sé quién te votó negativamente (¿y por qué?) Pero toma mi voto positivo. –

+0

¡Muchas gracias! Versión para C# 6.0 debajo de https://stackoverflow.com/a/48712010/2340825 –

0

Otra manera de lograr esto sería utilizar una declaración de LINQ. La respuesta recomendada no funcionó para mí en .NetCore2.0. Sin embargo, pude descifrarlo y a continuación también funcionaría si está usando tecnología más nueva.

[HttpPost] 
public ActionResult Report(FormCollection collection) 
{ 
    var listofIDs = collection.ToList().Select(x => x.ToString()); 
    List<Dinner> dinners = new List<Dinner>(); 
    dinners = repository.GetDinners(listofIDs); 
    return View(dinners); 
} 
2

¿Qué no probar? LINQ Segura que filtra enteros válidos (para C# 6.0 y anteriores):

List<int> ints = strings 
    .Select(s => { int i; return int.TryParse(s, out i) ? i : (int?)null; }) 
    .Where(i => i.HasValue) 
    .Select(i => i.Value) 
    .ToList(); 

de crédito a Olivier Jacot-Descombes por la idea y la versión de C# 7.0.

Cuestiones relacionadas