Come posso dividere e tagliare una corda in parti tutte su una riga?


124

Voglio dividere questa linea:

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

in una serie delle loro versioni tagliate:

"First Name"
"string"
"firstName"

Come posso fare tutto questo su una riga? Quanto segue mi dà un errore "impossibile convertire il tipo void":

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

2
L'errore viene restituito perché ForEachfunziona sull'istanza corrente di IEnumerablee restituisce void.
Majkel

Risposte:


291

Provare

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

Cordiali saluti, il metodo Foreach accetta un'azione (accetta T e restituisce void) per il parametro e il tuo lambda restituisce una stringa come stringa.

Il metodo di estensione Foreach ha lo scopo di modificare lo stato degli oggetti all'interno della raccolta. Poiché le stringhe sono immutabili, ciò non avrebbe alcun effetto

Spero che aiuti; o)

Cédric


3
Nota: ForEachnon è un metodo di estensione.
Guffa

La migliore soluzione a Linq!
Sonhja

Cosa succede se non ci sono valori restituisce null?
Demodave

se la riga è nulla, si ottiene un'eccezione. se la riga non contiene ";" avrai un elenco con una stringa corrispondente alla linea trimmid
Cédric Rup

22

Il ForEach metodo non restituisce nulla, quindi non puoi assegnarlo a una variabile.

Utilizza Selectinvece il metodo di estensione:

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

5

Perché p.Trim () restituisce una nuova stringa.

Devi usare:

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

3

In alternativa prova questo:

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

Questa è una grande idea, tuttavia, credo che manchi qualsiasi spazio vuoto alla fine della stringa, giusto?
jrichview

3

Ecco un metodo di estensione ...

    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

prova a usare Regex:

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

0

Split restituisce il tipo stringa []. Scrivi un metodo di estensione:

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

Mi è piaciuta la tua soluzione, quindi ho deciso di aggiungerla e renderla più utilizzabile.

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

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

Risultato:

peso

jon

uomo

Francesco

luke

sottovento

peso

Spiega il modello [,; \ s]: trova una corrispondenza di una delle due,; o carattere spaziale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.