¿Cómo puedo dividir y recortar una cuerda en partes todas en una línea?

124

Quiero dividir esta línea:

string line = "First Name ; string ; firstName";

en una variedad de sus versiones recortadas:

"First Name"
"string"
"firstName"

¿Cómo puedo hacer todo esto en una sola línea? Lo siguiente me da un error "no se puede convertir el tipo void":

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 
Edward Tanguay
fuente
2
Se devuelve el error porque ForEachfunciona en la instancia actual de IEnumerabley devuelve void.
Majkel el

Respuestas:

291

Tratar

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

Para su información, el método Foreach toma una acción (toma T y devuelve vacío) para el parámetro, y su lambda devuelve una cadena como cadena. Recortar devuelve una cadena

El método de extensión Foreach está destinado a modificar el estado de los objetos dentro de la colección. Como las cadenas son inmutables, esto no tendría efecto

Espero que ayude; o)

Cédric

Cédric Rup
fuente
3
Nota: ForEachno es un método de extensión.
Guffa
La mejor solución en Linq!
Sonhja
¿Qué pasa si no hay valores devuelve nulo?
Demodave el
si la línea es nula, obtienes una excepción. si la línea no contiene ';' tendrás una lista con una cadena correspondiente a la línea de trimmid
Cédric Rup
22

El ForEachmétodo no devuelve nada, por lo que no puede asignar eso a una variable.

Utilice el Selectmétodo de extensión en su lugar:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Guffa
fuente
5

Porque p.Trim () devuelve una nueva cadena.

Necesitas usar:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Matt Breckon
fuente
3

Alternativamente intente esto:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Lawrence Phillips
fuente
Esta es una gran idea, sin embargo, creo que se pierde cualquier espacio en blanco al final de la cadena, ¿correcto?
jrichview 01 de
3

Aquí hay un método de extensión ...

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }
LawMan
fuente
2

intenta usar Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
usuario2826608
fuente
0

Split devuelve el tipo de cadena []. Escribe un método de extensión:

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

Me gustó su solución, así que decidí agregarla y hacerla más utilizable.

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}
FoxjazzHack
fuente
-1

Use Regex

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

Resultado:

Beto

jon

hombre

francis

luke

sotavento

Beto

Explicar el patrón [,; \ s]: coincide con una aparición de cualquiera de los; o personaje espacial

Hung Vu
fuente