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.