Wie kann ich eine Saite in einer Linie teilen und in Teile schneiden?

124

Ich möchte diese Zeile teilen:

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

in eine Reihe ihrer zugeschnittenen Versionen:

"First Name"
"string"
"firstName"

Wie kann ich das alles in einer Zeile machen? Folgendes gibt mir den Fehler "Typ void kann nicht konvertiert werden":

List<string> parts = line.Split(';').ToList().ForEach(p => p.Trim()); 
Edward Tanguay
quelle
2
Der Fehler wird zurückgegeben, da er ForEachauf der aktuellen Instanz von funktioniert IEnumerableund zurückgegeben wird void.
Majkel

Antworten:

291

Versuchen

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

Zu Ihrer Information, die Foreach-Methode führt eine Aktion (nimmt T und gibt void zurück) für den Parameter aus, und Ihr Lambda gibt eine Zeichenfolge als Zeichenfolge zurück. Trim gibt eine Zeichenfolge zurück

Die Foreach-Erweiterungsmethode soll den Status von Objekten in der Sammlung ändern. Da Zeichenfolgen unveränderlich sind, hätte dies keine Auswirkungen

Hoffe es hilft; o)

Cédric

Cédric Rup
quelle
3
Hinweis: ForEachist keine Erweiterungsmethode.
Guffa
Beste Lösung in Linq!
Sonhja
Was ist, wenn es keine Werte gibt, gibt es null zurück?
Demodave
Wenn line null ist, erhalten Sie eine Ausnahme. wenn Zeile nicht ';' enthält Sie haben eine Liste mit einer Zeichenfolge, die der Trimmid-Linie entspricht
Cédric Rup
22

Das ForEach Methode gibt nichts zurück, daher können Sie dies keiner Variablen zuweisen.

Verwenden Sie Selectstattdessen die Erweiterungsmethode:

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

Weil p.Trim () eine neue Zeichenfolge zurückgibt.

Sie müssen verwenden:

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

Alternativ versuchen Sie dies:

string[] parts = Regex.Split(line, "\\s*;\\s*");
Lawrence Phillips
quelle
Dies ist eine großartige Idee, aber ich glaube, dass am Ende der Zeichenfolge keine nachgestellten Leerzeichen fehlen, richtig?
Jrichview
3

Hier ist eine Erweiterungsmethode ...

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

Versuchen Sie es mit Regex:

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

Split gibt den Typ string [] zurück. Schreiben Sie eine Erweiterungsmethode:

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

Ihre Lösung hat mir gefallen, deshalb habe ich beschlossen, sie zu ergänzen und benutzerfreundlicher zu machen.

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
quelle
-1

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

Ergebnis:

Bob

jon

Mann

Francis

Luke

Lee

Bob

Erklären Sie das Muster [,; \ s]: Passen Sie ein Vorkommen von entweder; oder Leerzeichen

Hung Vu
quelle