webentwicklung-frage-antwort-db.com.de

StringSplitOptions.RemoveEmptyEntries funktioniert nicht wie angekündigt

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.

22
Ben Foster

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));
32
TJHeuvel

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

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:

  1. Teilen Sie die Eingabe durch ',' und entfernen Sie den leeren Eintrag, ohne Leerzeichen. Sie haben also ein Array mit einigen Weltraumelementen. 
  2. Dann schneiden Sie jedes Element ab. Die Raumelemente werden leer. 

Deshalb hast du es verstanden. 

7
Coofucoo

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.

1
Teodor Tite
var tagsSplit = tags.Split(',')
                    .Where(str => str != String.IsNullOrWhiteSpace(str))
                    .Select(s => s.Trim());
0
Tilak

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.

0
JamesHoux