¿Cómo convertir List <string> a List <int>?


157

Mi pregunta es parte de este problema:

Recibo una colección de identificaciones de un formulario. Necesito obtener las claves, convertirlas a 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);
}

Respuestas:


391
listofIDs.Select(int.Parse).ToList()

Excepción planteada: 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

44
@ markthewizard1234 Eso sucederá si su listofIDses un IQueryable<string>que no se ha ejecutado. Ejecútelo primero ToList()antes de realizar la conversión:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck

Estoy seguro de que en 2013 esto funcionó, pero esto ya no funcionó para mí. Se agregó una opción más nueva a continuación utilizando la instrucción linq.
Brandon Turpy

1
Esto arrojará una excepción si alguna de las cadenas no son realmente ints. Vea las versiones seguras a continuación. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck La primera ToList debería ser AsEnumerable, no es necesario asignar una segunda Lista
Ronan Thibaudau

38

Usando Linq ...

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

20

Aquí hay una variante segura que filtra las entradas inválidas:

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 las nuevas outvariables introducidas con C # 7.0.

Esta otra variante devuelve una lista de nullentradas anulables donde se insertan entradas para entradas inválidas (es decir, conserva el recuento de la lista original):

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

¡Muchas gracias! Versión para C # 6.0 a continuación stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Usando Linq:

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

1
var intList = stringList.Select (Convert.ToInt32) .ToList ()
shivani

12

¿Qué no hay TryParse? Versión segura de LINQ que filtra las entradas no válidas (para C # 6.0 y siguientes):

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

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


3

Sé que es una publicación anterior, pero pensé que es una buena adición: puedes usar List<T>.ConvertAll<TOutput>

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

1

Esta es la forma más simple, creo:

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

66
Veo este tipo de patrón en las 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 <string, int> (Convert.ToInt32); . Eso es probablemente más legible, más rápido, más corto y ¿ya mencioné más elegante? Lo mismo ocurre con todos los demás que responden esta pregunta.
JBSnorro

Recibo un error al omitir la sintaxis de la flecha. Esto funciona: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));pero esto no: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);el error es una llamada ambigua entre las versiones string,int,inty string,intde Select.
goodeye

1

Convertir el valor de la cadena en una lista entera

var myString = "010"; 
int myInt;
List<int> B = myString.ToCharArray().Where(x => int.TryParse(x.ToString(), out myInt)).Select(x => int.Parse(x.ToString())).ToList();

0

Otra forma de lograr esto sería usar una instrucción linq. La respuesta recomendada no funcionó para mí en .NetCore2.0. Sin embargo, pude resolverlo y a continuación también funcionaría si está utilizando 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);
}

0

Puedes usarlo a través de LINQ

     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                             && int.TryParse(i,out int validNumber))
                            .Select(x=>int.Parse(x)).ToList();

Parece bastante un desperdicio para TryParse, que le da el valor, luego simplemente tire ese valor por la ventana para luego hacer un Parse. Básicamente eres doble análisis.
Ristogod

0
intList = Array.ConvertAll(stringList, int.Parse).ToList();

0

Esto puede ser excesivo para este simple problema. Pero para los métodos Try-Do en conexión con Linq, tiendo a usar clases anónimas para un código más expresivo. Es similar a las respuestas de Olivier Jacot-Descombes y BA TabNabber :

List<int> ints = strings
    .Select(idString => new { ParseSuccessful = Int32.TryParse(idString, out var id), Value = id })
    .Where(id => id.ParseSuccessful)
    .Select(id => id.Value)
    .ToList();

-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 proporcionar solo código.
carlosfigueira

-1
yourEnumList.Select(s => (int)s).ToList()

Hola patryk Bienvenido a StackOverflow. Sería mejor si pudiera escribir un poco más de descripción sobre la solución bastante concisa que ha publicado. Esta es la respuesta a una pregunta muy antigua en este sitio web y sería revisada por varios usuarios.
Aditya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.