2012-02-15 16 views
130
string tags = "9,3,12,43,2" 

List<int> TagIds = tags.Split(','); 

Esto no funciona hacer que el método split devuelve una cadena []¿Cómo puedo convertir cadena separada por comas en una lista <int>

favor, ayuda.

+1

posible duplicado de [¿Cómo crear una lista desde una cadena separada por comas?] (Http: // stackoverflow.com/questions/910119/how-to-create-a-listt-from-a-comma-separated-string) – Lijo

+0

Posible duplicado de [Convertir cadenas de entrada separadas por comas a una matriz int] (https://stackoverflow.com/ questions/1763613/convert-comma-separated-string-of-ints-to-int-array) – Lijo

Respuesta

308

Esta es una manera de hacerlo:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); 
+7

Eso también podría ser 'List TagIds = new List (tags.Split (','). Select (int.Parse)); ' – phoog

+2

¿Hay una necesidad de' new List <> '? – LiquidPony

+2

@LiquidPony no; usted podría llamar 'ToList()' en su lugar; el resultado es esencialmente el mismo: 'List 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 un' List <> ' – phoog

11

Puede utilizar LINQ w/int.Parse() para convertir el string[] a un IEnumerable<int> y luego pasar el resultado a la List<T> constructor:

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

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList(); 
5

Un pequeño LINQ va un largo camino:

List<int> TagIds = tags.Split(',') 
     .Select(t => int.Parse(t)) 
     .ToList(); 
1

Si está usando C# 3.5 puede utilizar LINQ para lograr este

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

o la corta

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

Sin LINQ consulta, puede elegir este método,

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

y luego puede convertir esta lista en número entero t ipo ...

10

Si desea incluir alguna validación simple y saltar sobre los valores no válidos (en lugar de lanzar una excepción), aquí hay algo que utiliza 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 

EDIT: Aquí es una actualización consulta basada en los comentarios de Antoine. Llama a TryParse primero para filtrar los valores incorrectos, y luego Parse para hacer 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 
+0

¡Falla si 0 es una entrada legítima! –

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 quitar todas las cadenas que no se pudieron convertir sin ningún error. Si necesita un error si hubo un problema con la conversión, entonces la respuesta aceptada debería hacer el truco.

1

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

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.

Cuestiones relacionadas