Jak mogę podzielić i przyciąć strunę na części w jednej linii?

125

Chcę podzielić tę linię:

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

do tablicy ich skróconych wersji:

"First Name"
"string"
"firstName"

Jak mogę to wszystko zrobić w jednej linii? Następujący komunikat powoduje wyświetlenie błędu „nie można przekształcić typu void”:

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 
Edward Tanguay
źródło
2
Błąd jest zwracany, ponieważ ForEachdziała na bieżącym wystąpieniu IEnumerablei zwraca void.
Majkel

Odpowiedzi:

292

Próbować

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

FYI, metoda Foreach przyjmuje Action (pobiera T i zwraca void) dla parametru, a twoja lambda zwraca ciąg jako ciąg.

Metoda rozszerzenia Foreach jest przeznaczona do modyfikowania stanu obiektów w kolekcji. Ponieważ ciąg jest niezmienny, nie miałoby to żadnego efektu

Mam nadzieję, że to pomoże; o)

Cédric

Cédric Rup
źródło
3
Uwaga: ForEachnie jest metodą rozszerzającą.
Guffa
Najlepsze rozwiązanie w Linq!
Sonhja
A jeśli nie ma żadnych wartości, to zwraca wartość null?
Demodave
jeśli linia jest pusta, otrzymasz wyjątek. jeśli wiersz nie zawiera „;” będziesz mieć listę z jednym ciągiem odpowiadającym linii przyciętej
Cédric Rup
22

ForEachMetoda nie zwraca niczego, więc nie można przypisać, że do zmiennej.

SelectZamiast tego użyj metody rozszerzenia:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Guffa
źródło
5

Ponieważ p.Trim () zwraca nowy ciąg.

Musisz użyć:

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();
Matt Breckon
źródło
3

Alternatywnie spróbuj tego:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Lawrence Phillips
źródło
To świetny pomysł, ale wydaje mi się, że pomija jakiekolwiek spacje na końcu ciągu, prawda?
jrichview
3

Oto metoda rozszerzenia ...

    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
źródło
2

spróbuj użyć Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();
user2826608
źródło
0

Split zwraca typ string []. Napisz metodę rozszerzenia:

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

Spodobało mi się Twoje rozwiązanie, więc zdecydowałem się je dodać i uczynić bardziej użytecznym.

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
źródło
-1

Użyj 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());

Wynik:

pion

jon

człowiek

francis

Łukasz

zawietrzny

pion

Wyjaśnij wzorzec [,; \ s]: Dopasuj jedno wystąpienie,; lub spacja

Hung Vu
źródło