Ich bin in der Vergangenheit mehrmals darauf gestoßen und habe mich schließlich entschlossen herauszufinden, warum.
StringSplitOptions.RemoveEmptyEntries
würde vorschlagen, dass er leere Einträge entfernt .
Warum scheitert dieser Test?
var tags = "One, Two, , Three, Foo Bar, , Day , ";
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
tagsSplit.ShouldEqual(new string[] {
"One",
"Two",
"Three",
"Foo Bar",
"Day"
});
Das Ergebnis:
Values differ at index [2]
Expected string length 5 but was 0. Strings differ at index 0.
Expected: "Three"
But was: <string.Empty>
Es schlägt also fehl, weil wir anstelle von "Three"
eine leere Zeichenfolge haben - genau das, was StringSplitOptions.RemoveEmptyEntries
verhindern soll.
Wahrscheinlich, weil Sie die Zeichenfolge nach dem Split ändern. Sie schneiden die Werte nach dem Aufteilen, RemoveEmptyEntries
betrachtet die Zeichenfolge " "
nicht als leer.
Folgendes würde das erreichen, was Sie möchten, indem Sie im Grunde Ihre eigenen leeren Elemente erstellen:
var tagsSplit = tags.Split(',').
Select(tag => tag.Trim()).
Where( tag => !string.IsNullOrEmpty(tag));
Angrenzende Trennzeichen ergeben ein Arrayelement, das ein empty .__ enthält. Zeichenfolge (""). Die Werte der StringSplitOptions-Enumeration geben an ob ein Arrayelement, das eine leere Zeichenfolge enthält, in .__ enthalten ist. das zurückgegebene Array.
" "
per Definition ist nicht leer (es ist tatsächlich Whitespace), es wird also nicht aus dem resultierenden Array entfernt.
Wenn Sie das .net Framework 4 verwenden, können Sie dies umgehen, indem Sie die Methode string.IsNullOrWhitespace verwenden.
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Where(x => !string.IsNullOrWhiteSpace(x))
.Select(s => s.Trim());
RemoveEmptyEntries bedeutet nicht Platz.
Ihre Eingabezeichenfolge enthält viele "Leerzeichen". Sie sollten bemerken, dass "Leerzeichen" nicht leer ist. Platz ist im Computer ein spezieller ASCII Code. also der code:
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
meint:
Deshalb hast du es verstanden.
Versuchen
var tagsSplit = tags.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
Dies spuckt durch Komma und Leerzeichen und beseitigt leere Zeichenfolgen.
Ich habe auch nach einem sauberen Weg gesucht, um Whitespace-Einträge auszuschließen während a Split, aber da alle Optionen wie eine Art Problemumgehung schienen, habe ich mich entschlossen, sie beim Schleifen über das Array auszuschließen.
string[] tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string tag in tagsSplit.Where(t => !string.IsNullOrWhiteSpace(t))) { }
Ich denke, das sieht sauberer aus und - als Bonus - kann .Split(...).ToArray()
weggelassen werden. Natürlich ist es nur eine Option, wenn Sie nach dem Split eine Schleife machen und keine Einträge für eine spätere Verwendung speichern müssen.
var tagsSplit = tags.Split(',')
.Where(str => str != String.IsNullOrWhiteSpace(str))
.Select(s => s.Trim());
Da dies ein sehr häufiges Bedürfnis ist, habe ich die populärste Antwort in eine String-Erweiterungsmethode verpackt:
public static IEnumerable<string> Split_RemoveWhiteTokens(this string s, params char[] separator)
{
return s.Split(separator).
Select(tag => tag.Trim()).
Where(tag => !string.IsNullOrEmpty(tag));
}
Verwenden Sie zum Aufteilen von ',' wie die anderen Beispiele Folgendes:
var result = yourString.Split_RemoveWhiteTokens(',')
Beachten Sie, dass der Rückgabetyp IEnumerable ist. Sie können also zusätzliche LINQ-Abfragen direkt am Rückgabeergebnis ausführen. Rufen Sie .ToList () auf, wenn Sie das Ergebnis in eine Liste umwandeln möchten.