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.
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(newchar[]{','},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.
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=newList<int>();string[] split = tags.Split(',');foreach(string item in split){int val =0;if(int.TryParse(item,out val)==true){TagIds.Add(val);}}
Respuestas:
Aquí hay una forma de hacerlo:
fuente
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?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 deSelect()
es unIEnumerable<>
, pero no unList<>
Select
extensión en este caso regresaIEnumerable<Int32>
y no está en la lista. Sin embargo, la lista tiene un constructor que acepta otra colección como fuente.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
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:
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.
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.
fuente
int.TryParse(m, out int _)
Puede usar LINQ w /
int.Parse()
para convertirstring[]
a anIEnumerable<int>
y luego pasar ese resultado alList<T>
constructor:fuente
Un poco de LINQ recorre un largo camino:
fuente
Sin LINQ Query, puede elegir este método,
y luego puedes convertir esta lista en tipo entero ...
fuente
.ToList<string>()
todavía necesitausing System.Linq;
fuente
.Select(x => x.Trim()
, ya que Parse recorta automáticamente cualquier espacio para usted.Si está usando C # 3.5, puede usar Linq para lograr esto
o el corto
fuente
fuente
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.
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.
fuente
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.
Espero que esto ayude.
fuente
Es sencillo. Primero divide la cuerda. Recorte el espacio en blanco presente después de la coma (,). Luego use el sistema definido ToList ()
Para eliminar el espacio después de ',' y convertir este texto separado por comas a Lista
fuente