Dividir cadena, convertir ToList <int> () en una línea

191

Tengo una cadena que tiene números

string sNumbers = "1,2,3,4,5";

Puedo dividirlo y luego convertirlo a List<int>

sNumbers.Split( new[] { ',' } ).ToList<int>();

¿Cómo puedo convertir una matriz de cadenas a una lista entera? Para poder convertir string[]aIEnumerable

uzay95
fuente
Hemos tenido exactamente la misma pregunta hoy: Click me
Darío
3
en "una línea" si una muy fuerte es un requisito muy estricto! </perl>
dfa
2
Esta pregunta dice específicamente dividir una cadena de números, lo que mantiene la respuesta simple. La pregunta que Dario mencionó trata los problemas de TryParse para cadenas generales.
goodeye

Respuestas:

463
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();
mqp
fuente
44
Esto obtiene una excepción cuando la lista tiene un valor vacío o nulo.
Sayed Muhammad Idrees
@ SayedM.Idrees simplemente marque nulo o vacío antes de dividir.
RAVI VAGHELA
31

También puede hacerlo de esta manera sin la necesidad de Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();
Joze
fuente
18

La forma de Joze también necesita LINQ, ToList()está en el System.Linqespacio de nombres.

Puede convertir Array a List sin Linq pasando la matriz a List constructor:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );
yuxio
fuente
17

Mejor uso int.TryParsepara evitar excepciones;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();
aozogul
fuente
10

También es posible int array para asignar directamente el valor.

Me gusta esto

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();
Mukesh Kalgude
fuente
4

También puedes usar este método de extensión

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

uso:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');
Pcodea Xonos
fuente
3

En Unity3d, int.Parseno funciona bien. Entonces uso como abajo.

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

Espero esta ayuda para los usuarios de Unity3d.

HyoJin KIM
fuente
3

Puede usar las nuevas características del lenguaje C # 6.0:

  • reemplazar delegado (s) => { return Convert.ToInt32(s); }con el grupo de métodos correspondienteConvert.ToInt32
  • reemplace la llamada de constructor redundante: new Converter<string, int>(Convert.ToInt32)con:Convert.ToInt32

El resultado será:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));
Adrian Filip
fuente
2

Mi problema era similar pero con el inconveniente de que a veces la cadena contiene letras (a veces vacías).

string sNumbers = "1,2,hh,3,4,x,5";

Intentando seguir el método de extensión Pcode Xonos:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}
Carlos Toledo
fuente
1
Gracias, aunque declaras un separador y luego no lo usas.
Hugo Delsing
-2

Puedes usar esto:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();
Charanjot
fuente
2
¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. ¡Intente también no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones!
Goodbye StackExchange el
2
La función ConvertIntoIntList no existe.
Federico Navarrete
Además, debe agregar la siguiente clase: clase pública estática HelperMethods {Lista pública estática <int> ConvertIntoIntList (esta cadena [] stringList) {int x = 0; var intList = stringList.Where (str => int. TryParse (str, out x)) .Select (str => x) .ToList (); volver intList; }}
Federico Navarrete