Ich habe eine Zeichenfolge, die wie folgt eingeht:
string email = "[email protected], [email protected], [email protected]";
Ich möchte es in eine Reihe von Zeichenfolgen aufteilen
Wenn ich das mache:
string[] emails = email.Split(',');
Ich bekomme Leerzeichen vor jeder E-Mail-Adresse (nach der ersten):
emails[0] = "[email protected]"
emails[1] = " [email protected]"
emails[2] = " [email protected]"
Was ist der beste Weg, um dies zu erreichen (entweder ein besserer Weg zum Parsen oder ein Weg, um alle Strings in einem Array zu trimmen)?
emails[0] = "[email protected]"
emails[1] = "[email protected]"
emails[2] = "[email protected]"
Antworten:
Sie können auch alle Vorkommen von Leerzeichen ersetzen und so die foreach-Schleife vermeiden:
string email = "[email protected], [email protected], [email protected]"; string[] emails = email.Replace(" ", "").Split(',');
quelle
emails.Split(',').Select(email => email.Trim()).ToArray()
quelle
email.Split(...)...
stattdessen seinemails.Split(..)...
? Ich denke, E-Mails sind bereits das geteilte Array.Select
eine Familie von Erweiterungsmethoden, aus denen LINQ imSystem.Linq
Namespace besteht.Eine der folgenden Möglichkeiten würde funktionieren. Ich würde das erste empfehlen, da es die Verbindungszeichenfolge genauer ausdrückt.
string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None); string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
quelle
Sie können Trim () verwenden:
string email = "[email protected], [email protected], [email protected]"; string[] emails = email.Split(','); emails = (from e in emails select e.Trim()).ToArray();
quelle
Verwenden Sie
Regex.Split
diese Option , um ein Trimmen zu vermeidenvar emails = Regex.Split(email, @",\s*");
quelle
Sie können eine einzeilige Lösung wie die folgende verwenden:
string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries); Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim());
quelle
Wenn Sie nur die Einträge bearbeiten müssen, ohne das Array zurückzugeben:
string[] emails = text.Split(','); Array.ForEach(emails, e => e.Trim());
quelle
Alternativ können Sie mit einem regulären Ausdruck des Formulars teilen:
dh
string[] emails = Regex.Split(email, @"\s*,\s*");
Es wird die umgebenden Räume direkt verbrauchen.
Reguläre Ausdrücke sind normalerweise ein Leistungseinbruch, aber das Beispiel, das Sie gegeben haben, zeigt, dass Sie dies einmal in Ihrem Code für ein kurzes Array tun möchten.
quelle
Die Antwort von Bryan Watts ist elegant und einfach. Er verweist implizit auf das Array von Zeichenfolgen, die von Split () erstellt wurden.
Beachten Sie auch die Erweiterbarkeit, wenn Sie eine Datei lesen und die Daten beim Erstellen eines Arrays massieren möchten.
string sFileA = @"C:\Documents and Settings\FileA.txt"; string sFileB = @"C:\Documents and Settings\FileB.txt"; // Trim extraneous spaces from the first file's data string[] fileAData = (from line in File.ReadAllLines( sFileA ) select line.Trim()).ToArray(); // Strip a second unneeded column from the second file's data string[] fileBData = (from line in File.ReadAllLines( sFileB ) select line.Substring( 0, 21 ).Trim()).ToArray();
Natürlich können Sie die Notation Linq => verwenden, wenn Sie dies bevorzugen.
string[] fileBData = File.ReadAllLines( sFileB ).Select( line => line.Substring( 0, 21 ).Trim()).ToArray();
Obwohl meine Antwort als Kommentar hätte veröffentlicht werden sollen, habe ich noch nicht genügend Reputationspunkte, um einen Kommentar abzugeben. Ich fand diese Diskussion jedoch von unschätzbarem Wert, um herauszufinden, wie Daten mithilfe von ReadAllLines () massiert werden können.
quelle
File.ReadLines
.ReadAllLines
"schlürft" die gesamte Datei in ein Array im Speicher, was bei großen Dateien offensichtlich problematisch sein kann.ReadLines
liest jeweils nur eine Zeile, was großartig ist, wenn Sie die ursprüngliche Version des Inhalts nicht behalten müssen.Verwenden Sie
String.Trim
in einerforeach
Schleife oder wenn Sie .NET 3.5+ verwenden, eine LINQ-Anweisung.quelle
.NET 5 ist da und damit eine moderne Lösung für dieses Problem:
string[] emails = email.Split(',', StringSplitOptions.TrimEntries);
quelle