¿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()); 

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


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();

5

Porque p.Trim () devuelve una nueva cadena.

Necesitas usar:

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

3

Alternativamente intente esto:

string[] parts = Regex.Split(line, "\\s*;\\s*");

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();
    }

2

intenta usar Regex:

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

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;
}

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.