¿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.