Como posso dividir e aparar uma corda em partes, tudo em uma linha?

124

Eu quero dividir esta linha:

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

em uma matriz de suas versões cortadas:

"First Name"
"string"
"firstName"

Como posso fazer isso tudo em uma linha? A seguir, aparece um erro "Não é possível converter o tipo void":

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 
Edward Tanguay
fonte
2
O erro é retornado porque ForEachfunciona na instância atual de IEnumerablee retorna void.
Majkel 13/11/2009

Respostas:

291

Experimentar

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

FYI, o método Foreach realiza uma ação (recebe T e retorna nulo) para o parâmetro, e seu lambda retorna uma sequência como sequência.Trim retorna uma sequência

O método de extensão Foreach visa modificar o estado dos objetos na coleção. Como a string é imutável, isso não terá efeito

Espero que ajude; o)

Cédric

Cédric Rup
fonte
3
Nota: ForEachnão é um método de extensão.
Guffa
Melhor solução em Linq!
Sonhja
E se não houver valores, ele retornará nulo?
Demodave 27/01
se a linha for nula, você receberá uma exceção. se a linha não contiver ';' você terá uma lista com uma string correspondente à linha trimmid
Cédric Rup
22

O ForEachmétodo não retorna nada, então você não pode atribuir isso a uma variável.

Use o Selectmétodo de extensão:

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

Porque p.Trim () retorna uma nova string.

Você precisa usar:

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

Como alternativa, tente o seguinte:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Lawrence Phillips
fonte
Essa é uma ótima idéia, no entanto, acredito que falhe algum espaço em branco no final da string, correto?
jrichview
3

Aqui está um método de extensão ...

    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
fonte
2

tente usar o Regex:

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

Split retorna o tipo de string []. Escreva um método de extensão:

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

Gostei da sua solução, por isso decidi adicioná-la e torná-la mais utilizável.

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
fonte
-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:

prumo

Jon

homem

francis

Lucas

lee

prumo

Explique o padrão [,; \ s]: corresponde a uma ocorrência de,; ou caractere de espaço

Hung Vu
fonte