Ich rufe eine REST-API auf und erhalte eine XML-Antwort zurück. Es gibt eine Liste der Namen eines Arbeitsbereichs zurück, und ich schreibe eine schnelle IsExistingWorkspace()
Methode. Da alle Arbeitsbereiche aus zusammenhängenden Zeichen ohne Leerzeichen bestehen, gehe ich davon aus, dass der einfachste Weg, um herauszufinden, ob sich ein bestimmter Arbeitsbereich in der Liste befindet, darin besteht, alle Leerzeichen (einschließlich Zeilenumbrüche) zu entfernen und dies zu tun (XML ist die vom Web empfangene Zeichenfolge) Anfrage):
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 einem String effizient zu entfernen. Ich weiß, dass RegEx und LINQ das können, aber ich bin offen für andere Ideen. Ich mache mir meistens nur Sorgen um die Geschwindigkeit.
quelle
Antworten:
Dies ist der schnellste Weg, den ich kenne, obwohl Sie sagten, Sie wollten keine regulären Ausdrücke verwenden:
quelle
Regex.Replace(XML, @"\s+", "")
?private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); }
\s
bedeutet dies "mit einem beliebigen Leerzeichen übereinstimmen" und+
"mit einem oder mehreren der fortlaufenden Token übereinstimmen". Auch RegExr ist eine schöne Website zu schreiben RegEx Ausdrücke mit üben, wenn Sie experimentieren wollen.Ich habe einen alternativen Weg ohne Regexp, und es scheint ziemlich gut zu funktionieren. Es ist eine Fortsetzung der Antwort von Brandon Moretz:
Ich habe es in einem einfachen Unit-Test getestet:
Bei 1.000.000 Versuchen dauert die erste Option (ohne regulären Ausdruck) weniger als eine Sekunde (700 ms auf meinem Computer), und die zweite dauert 3,5 Sekunden.
quelle
.ToCharArray()
ist nicht nötig; Sie können.Where()
direkt auf einer Zeichenfolge verwenden.ToCharArray
schneller ist als die.Where()
direkte Verwendung in der Zeichenfolge. Dies hat etwas mit dem Overhead inIEnumerable<>
jedem Iterationsschritt zu tun , und die Tatsache,ToCharArray
dass es sehr effizient ist (Blockkopie) und der Compiler die Iteration über Arrays optimiert. Warum dieser Unterschied besteht, konnte mir niemand erklären, sondern messen, bevor Sie entfernenToCharArray()
.Versuchen Sie die Ersetzungsmethode der Zeichenfolge in C #.
quelle
Meine Lösung besteht darin, Split and Join zu verwenden, und es ist überraschend schnell, tatsächlich die schnellste der Top-Antworten hier.
Timings für 10.000 Schleifen auf einfachen Zeichenfolgen mit Leerzeichen inkl. Neuen Zeilen und Tabulatoren
Verbessern Sie dies, indem Sie es in eine Methode einwickeln, um ihm eine Bedeutung zu geben, und machen Sie es auch zu einer Erweiterungsmethode, während wir gerade dabei sind ...
quelle
string[]
undchar[]
? Sie müssen nur angeben, welche Sie möchten, zstring.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. Genau das macht Ihr Aufrufdefault
in diesem Fall, da er ebenfalls zurückkehrtnull
: Er hilft dem Compiler bei der Entscheidung, welche Überladung ausgewählt werden soll. Daher mein Kommentar, weil die Aussage in Ihrem Kommentar "Split benötigt ein gültiges Array und null reicht nicht ..." falsch ist. Keine große Sache, nur erwähnenswert, da Jake Drew fragte, wie das funktioniert. +1 für Ihre Antwortstring.Concat("H \ne llo Wor ld".Split())
Aufbauend auf Henks Antwort ich einige Testmethoden mit seiner Antwort erstellt und einige hinzugefügte, optimierte Methoden. Ich habe festgestellt, dass die Ergebnisse je nach Größe der Eingabezeichenfolge unterschiedlich sind. Deshalb habe ich mit zwei Ergebnismengen getestet. Bei der schnellsten Methode hat die verknüpfte Quelle einen noch schnelleren Weg. Aber da es als unsicher eingestuft wird, habe ich dies weggelassen.
Lange Eingabezeichenfolge Ergebnisse:
Kurze Ergebnisse der Eingabezeichenfolge:
Code :
Tests :
Bearbeiten : Getestet einen schönen Einzeiler von Kernowcode.
quelle
Nur eine Alternative, weil es ganz gut aussieht :) - HINWEIS : Henks Antwort ist die schnellste davon.
Testen von 1.000.000 Schleifen
"This is a simple Test"
Diese Methode = 1,74 Sekunden
Regex = 2,58 Sekunden
new String
(Henks) = 0,82quelle
Ich habe auf CodeProject von Felipe Machado (mit Hilfe von Richard Robertson ) eine schöne Zusammenfassung dazu gefunden.
Er testete zehn verschiedene Methoden. Dies ist die schnellste unsichere Version ...
Und die schnellste sichere Version ...
Es gibt auch einige nette unabhängige Benchmarks zu Stack Overflow von Stian Standahl, die auch zeigen, dass Felipes Funktion etwa 300% schneller ist als die nächstschnellste Funktion.
quelle
Wenn Sie eine hervorragende Leistung benötigen, sollten Sie in diesem Fall LINQ und reguläre Ausdrücke vermeiden. Ich habe ein Performance-Benchmarking durchgeführt, und es scheint, dass string.Trim () Ihre ultimative Funktion ist, wenn Sie Leerzeichen vom Anfang und Ende des Strings entfernen möchten.
Wenn Sie alle Leerzeichen von einer Zeichenfolge entfernen müssen, funktioniert die folgende Methode am schnellsten von allen hier veröffentlichten:
quelle
Regex ist übertrieben; Verwenden Sie einfach die Erweiterung für die Zeichenfolge (danke Henk). Dies ist trivial und sollte Teil des Rahmens sein. Wie auch immer, hier ist meine Implementierung:
quelle
System.Linq
Hier ist eine einfache lineare Alternative zur RegEx-Lösung. Ich bin mir nicht sicher, was schneller ist; Sie müssten es messen.
quelle
Ich musste Leerzeichen in einer Zeichenfolge durch Leerzeichen ersetzen, aber keine doppelten Leerzeichen. Ich musste beispielsweise Folgendes konvertieren:
zu
Ich habe die folgende Methode verwendet
quelle
Ich gehe davon aus, dass Ihre XML-Antwort folgendermaßen aussieht:
Der beste Weg, XML zu verarbeiten, ist die Verwendung eines XML-Parsers wie LINQ to XML :
quelle
Hier ist noch eine andere Variante:
Wie bei den meisten anderen Lösungen habe ich keine umfassenden Benchmark-Tests durchgeführt, aber dies funktioniert für meine Zwecke gut genug.
quelle
Wir können benutzen:
quelle
null
.Ich habe festgestellt, dass unterschiedliche Ergebnisse wahr sind. Ich versuche, alle Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen, und der reguläre Ausdruck war extrem langsam.
Was für mich (in C ++ cli) am besten funktioniert hat, war:
Ich habe die obige Routine zuerst versucht, indem ich jedes Zeichen separat ersetzt habe, musste aber auf Teilzeichenfolgen für die Nicht-Leerzeichen-Abschnitte umsteigen. Bei der Anwendung auf eine 1.200.000 Zeichenfolge:
quelle