501 Stimmen

Effiziente Weise zu entfernen ALLE Leerzeichen aus String?

Ich rufe eine REST-API auf und erhalte eine XML-Antwort zurück. Sie gibt eine Liste von Arbeitsbereichsnamen zurück, und ich schreibe eine schnelle IsExistingWorkspace() Methode. Da alle Arbeitsbereiche aus zusammenhängenden Zeichen ohne Leerzeichen bestehen, nehme ich an, dass der einfachste Weg, um herauszufinden, ob ein bestimmter Arbeitsbereich in der Liste enthalten ist, darin besteht, alle Leerzeichen (einschließlich Zeilenumbrüche) zu entfernen und dies zu tun (XML ist die Zeichenkette, die von der Webanforderung empfangen wird):

XML.Contains("<name>" + workspaceName + "</name>");

Ich weiß, dass zwischen Groß- und Kleinschreibung unterschieden wird, und darauf verlasse ich mich. Ich brauche nur eine Möglichkeit, alle Leerzeichen in einer Zeichenfolge effizient zu entfernen. Ich weiß, RegEx und LINQ kann es tun, aber ich bin offen für andere Ideen. Ich bin vor allem nur über die Geschwindigkeit besorgt.

7 Stimmen

Das Parsen von XML mit Regex ist fast so schlimm wie Parsen von HTML mit Regex .

3 Stimmen

@henk holterman; Siehe meine Antwort unten, regexp scheint nicht in allen Fällen die schnellste zu sein.

0 Stimmen

Regex scheint nicht der schnellste zu sein. Ich habe die Ergebnisse vieler verschiedener Methoden zum Entfernen von Leerzeichen aus einer Zeichenkette zusammengefasst. Die Zusammenfassung ist in einer Antwort unten - stackoverflow.com/a/37347881/582061

4voto

Brandon Moretz Punkte 7322

Hier ist eine einfache lineare Alternative zur RegEx-Lösung. Ich bin mir nicht sicher, welche schneller ist; Sie müssten einen Benchmark durchführen.

static string RemoveWhitespace(string input)
{
    StringBuilder output = new StringBuilder(input.Length);

    for (int index = 0; index < input.Length; index++)
    {
        if (!Char.IsWhiteSpace(input, index))
        {
            output.Append(input[index]);
        }
    }
    return output.ToString();
}

4voto

user1325543 Punkte 493

Ich musste Leerzeichen in einer Zeichenkette durch Leerzeichen ersetzen, aber keine doppelten Leerzeichen. z.B. musste ich etwas wie das Folgende konvertieren:

"a b   c\r\n d\t\t\t e"

zu

"a b c d e"

Ich habe die folgende Methode angewandt

private static string RemoveWhiteSpace(string value)
{
    if (value == null) { return null; }
    var sb = new StringBuilder();

    var lastCharWs = false;
    foreach (var c in value)
    {
        if (char.IsWhiteSpace(c))
        {
            if (lastCharWs) { continue; }
            sb.Append(' ');
            lastCharWs = true;
        }
        else
        {
            sb.Append(c);
            lastCharWs = false;
        }
    }
    return sb.ToString();
}

2voto

dtb Punkte 205441

Ich nehme an, Ihre XML-Antwort sieht so aus:

var xml = @"<names>
                <name>
                    foo
                </name>
                <name>
                    bar
                </name>
            </names>";

Die beste Möglichkeit, XML zu verarbeiten, ist die Verwendung eines XML-Parsers, z. B. LINQ zu XML :

var doc = XDocument.Parse(xml);

var containsFoo = doc.Root
                     .Elements("name")
                     .Any(e => ((string)e).Trim() == "foo");

0 Stimmen

Sobald ich überprüft habe, dass ein bestimmter <Name>-Tag den richtigen Wert hat, bin ich fertig. Würde das Parsen des Dokuments nicht einen gewissen Overhead bedeuten?

4 Stimmen

Sicher, es gibt einen gewissen Overhead. Aber sie hat den Vorteil, dass sie korrekt ist. Eine Lösung, die z. B. auf Regex basiert, ist viel schwieriger richtig zu machen. Wenn Sie feststellen, dass eine LINQ to XML-Lösung zu langsam ist, können Sie sie jederzeit durch etwas Schnelleres ersetzen. Sie sollten jedoch vermeiden, nach der effizientesten Implementierung zu suchen, bevor Sie wissen, dass die richtige zu langsam ist.

0 Stimmen

Dies wird auf den Backend-Servern meines Arbeitgebers laufen. Ich bin auf der Suche nach einer leichtgewichtigen Lösung. Ich will nicht etwas, das "nur funktioniert", sondern optimal ist.

2voto

Tarik BENARAB Punkte 21

Wir können verwenden:

    public static string RemoveWhitespace(this string input)
    {
        if (input == null)
            return null;
        return new string(input.ToCharArray()
            .Where(c => !Char.IsWhiteSpace(c))
            .ToArray());
    }

0 Stimmen

Das ist fast genau dasselbe wie die Antwort von Henk oben. Der einzige Unterschied ist, dass Sie prüfen, ob null .

1 Stimmen

Ja, Prüfung auf Null ist wichtig

1 Stimmen

Vielleicht hätte dies nur ein Kommentar zu seiner Antwort sein sollen. Ich bin jedoch froh, dass Sie es angesprochen haben. Ich wusste nicht, dass Erweiterungsmethoden auf Null-Objekten aufgerufen werden können.

2voto

Kewin Remy Punkte 482

Mit Linq können Sie eine lesbare Methode auf diese Weise schreiben:

    public static string RemoveAllWhitespaces(this string source)
    {
        return string.IsNullOrEmpty(source) ? source : new string(source.Where(x => !char.IsWhiteSpace(x)).ToArray());
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X