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

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


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

5

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

Sie müssen verwenden:

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

3

Alternativ versuchen Sie dies:

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

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

2

Versuchen Sie es mit Regex:

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

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

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.