¿Cómo puedo convertir una cadena separada por comas en una Lista <int>

Respuestas:

435

Aquí hay una forma de hacerlo:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
dasblinkenlight
fuente
11
Eso también podría serList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog
2
¿Hay una necesidad para el new List<>?
LiquidPony
2
@LiquidPony no; podrías llamar en su ToList()lugar; el resultado es esencialmente el mismo: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); sin embargo, debe hacer uno u otro, porque el valor de retorno de Select()es un IEnumerable<>, pero no unList<>
phoog
@LiquidPony en esta implementación sí, ya que la Selectextensión en este caso regresa IEnumerable<Int32>y no está en la lista. Sin embargo, la lista tiene un constructor que acepta otra colección como fuente.
Oybek
8
Para manejar el caso donde las etiquetas son una cadena vacía, useSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill
25

Si desea incluir una validación simple y omitir valores no válidos (en lugar de lanzar una excepción), aquí hay algo que usa TryParse:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

EDITAR: Aquí hay una consulta actualizada basada en los comentarios de Antoine. Llama a TryParse primero para filtrar los valores incorrectos y luego a Parse para realizar la conversión real.

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

Edición 2: una consulta actualizada para C # 7.0, gracias a los comentarios de Charles Burns. Tenga en cuenta que con este enfoque eliminamos la variable mos extra, por lo que es un poco más limpio.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();
khalid13
fuente
1
¡Falla si 0 es una entrada legítima!
Antoine Meltzheim el
2
Con C # 7.0 puede omitir la declaración de mos y reemplazar la llamada de TryParse conint.TryParse(m, out int _)
Charles Burns
14

Puede usar LINQ w / int.Parse()para convertir string[]a an IEnumerable<int>y luego pasar ese resultado al List<T>constructor:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));
Justin Niessner
fuente
8

Un poco de LINQ recorre un largo camino:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
fuente
6

Sin LINQ Query, puede elegir este método,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

y luego puedes convertir esta lista en tipo entero ...


fuente
solo una nota para cualquiera que no esté familiarizado = .ToList<string>()todavía necesitausing System.Linq;
Bill Rawlinson
2

Si está usando C # 3.5, puede usar Linq para lograr esto

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

o el corto

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();
Agustín Meriles
fuente
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
fuente
1

Hice una modificación a la respuesta de khalid13. Si el usuario pone una cadena de "0", su respuesta eliminaría eso de la lista resultante. Hice algo similar pero usé un objeto anónimo.

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection es una función personalizada que hice que protege si la cadena es nula.

Lo que hace lo anterior es eliminar cualquier cadena que no se haya podido convertir sin error. Si necesita un error si hubo un problema con la conversión, entonces la respuesta aceptada debería ser suficiente.

SolidSnake4444
fuente
1

Me topé con esto y solo quiero compartir mi propia solución sin linq. Este es un enfoque primitivo. Los valores no enteros tampoco se agregarán en la lista.

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

Espero que esto ayude.

drchanix
fuente
-2

Es sencillo. Primero divide la cuerda. Recorte el espacio en blanco presente después de la coma (,). Luego use el sistema definido ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Para eliminar el espacio después de ',' y convertir este texto separado por comas a Lista

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Parag555
fuente