Dzwonię do interfejsu API REST i otrzymuję odpowiedź XML. Zwraca listę nazw obszarów roboczych, a ja piszę szybką IsExistingWorkspace()
metodę. Ponieważ wszystkie obszary robocze składają się z ciągłych znaków bez białych spacji, zakładam, że najłatwiejszym sposobem sprawdzenia, czy dany obszar roboczy znajduje się na liście, jest usunięcie wszystkich białych spacji (w tym nowych linii) i zrobienie tego (XML to ciąg otrzymany z sieci żądanie):
XML.Contains("<name>" + workspaceName + "</name>");
Wiem, że wielkość liter ma znaczenie i polegam na tym. Potrzebuję tylko sposobu na skuteczne usunięcie wszystkich białych znaków w ciągu. Wiem, że RegEx i LINQ mogą to zrobić, ale jestem otwarty na inne pomysły. Martwię się głównie o prędkość.
c#
removing-whitespace
Corey Ogburn
źródło
źródło
Odpowiedzi:
To najszybszy sposób, jaki znam, nawet jeśli powiedziałeś, że nie chcesz używać wyrażeń regularnych:
źródło
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
oznacza „dopasuj dowolny token białych znaków” i+
„dopasuj jeden lub więcej tokenów postępowania”. Również RegExr to strona miło ćwiczyć pisanie wyrażeń regex z, jeśli chcesz eksperymentować.Mam alternatywny sposób bez wyrażeń regularnych i wydaje się, że działa całkiem dobrze. Jest to kontynuacja odpowiedzi Brandona Moretza:
Testowałem to w prostym teście jednostkowym:
W przypadku 1 000 000 prób pierwsza opcja (bez wyrażenia regularnego) działa w mniej niż sekundę (700 ms na moim komputerze), a druga zajmuje 3,5 sekundy.
źródło
.ToCharArray()
to nie jest konieczne; możesz użyć.Where()
bezpośrednio na sznurku.ToCharArray
jest szybsze niż użycie.Where()
bezpośrednio w ciągu. Ma to coś wspólnego z narzutem naIEnumerable<>
każdym etapie iteracji, a jegoToCharArray
bycie bardzo wydajnym (kopiowanie bloków) i kompilatorem optymalizuje iterację nad tablicami. Dlaczego ta różnica istnieje, nikt nie był w stanie mi wyjaśnić, ale zmierzyć, zanim usunieszToCharArray()
.Wypróbuj metodę zamiany ciągu w C #.
źródło
Moim rozwiązaniem jest użycie Split and Join i jest on zaskakująco szybki, w rzeczywistości najszybszy z najlepszych odpowiedzi tutaj.
Czasy dla 10 000 pętli na prostym łańcuchu z białymi znakami, w tym nowe linie i tabulatory
Popraw to, zawijając go w metodzie, aby nadać mu znaczenie, a także uczyń ją metodą rozszerzenia, gdy jesteśmy przy niej ...
źródło
string[]
ichar[]
? musisz tylko określić, który chcesz, npstring.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. : . To właśnie robi to Twoje wezwaniedefault
w tym przypadku, ponieważ również zwracanull
: pomaga kompilatorowi zdecydować, które przeciążenie wybrać. Stąd mój komentarz, ponieważ stwierdzenie w twoim komentarzu „Split potrzebuje prawidłowej tablicy, a null nie zrobi ...” jest fałszywe. Nic wielkiego, po prostu warto o tym wspomnieć, skoro Jake Drew zapytał, jak to działa. +1 za twoją odpowiedźstring.Concat("H \ne llo Wor ld".Split())
Opierając się na odpowiedzi Henksa Stworzyłem kilka metod testowych z jego odpowiedzią i kilka dodanych, bardziej zoptymalizowanych metod. Odkryłem, że wyniki różnią się w zależności od wielkości ciągu wejściowego. Dlatego testowałem z dwoma zestawami wyników. W najszybszej metodzie połączone źródło ma jeszcze szybszy sposób. Ale ponieważ jest to określane jako niebezpieczne, pominąłem to.
Wyniki długiego ciągu wejściowego:
Wyniki krótkiego ciągu wejściowego:
Kod :
Testy :
Edycja : Testowałem niezłą liner z Kernowcode.
źródło
Po prostu alternatywa, ponieważ wygląda całkiem fajnie :) - UWAGA: odpowiedź Henks jest najszybsza z nich.
Testowanie 1 000 000 pętli na
"This is a simple Test"
Ta metoda = 1,74 sekundy
Regex = 2,58 sekundy
new String
(Henks) = 0,82źródło
Znalazłem fajny artykuł na ten temat na CodeProject autorstwa Felipe Machado (z pomocą Richarda Robertsona )
Przetestował dziesięć różnych metod. Ta jest najszybszą niebezpieczną wersją ...
I najszybsza bezpieczna wersja ...
Istnieją również niezłe niezależne testy porównawcze dotyczące przepełnienia stosu autorstwa Stiana Standahla, które pokazują również, że funkcja Felipe jest około 300% szybsza niż następna najszybsza funkcja.
źródło
Jeśli potrzebujesz doskonałej wydajności, w tym przypadku powinieneś unikać LINQ i wyrażeń regularnych. Przeprowadziłem testy wydajności i wydaje się, że jeśli chcesz usunąć białe znaki z początku i końca łańcucha, string.Trim () jest twoją ostateczną funkcją.
Jeśli chcesz usunąć wszystkie białe spacje z łańcucha, następująca metoda działa najszybciej ze wszystkich, które zostały tutaj opublikowane:
źródło
Regex to przesada; po prostu użyj rozszerzenia na łańcuchu (dzięki Henk). Jest to trywialne i powinno być częścią frameworka. Tak czy inaczej, oto moja implementacja:
źródło
System.Linq
Oto prosta liniowa alternatywa dla rozwiązania RegEx. Nie jestem pewien, co jest szybsze; musiałbyś to przetestować.
źródło
Musiałem zastąpić białe znaki w ciągu spacjami, ale nie duplikować spacji. np. musiałem przekonwertować coś takiego:
do
Użyłem następującej metody
źródło
Zakładam, że twoja odpowiedź XML wygląda następująco:
Najlepszym sposobem przetwarzania XML jest użycie parsera XML, takiego jak LINQ to XML :
źródło
Oto kolejny wariant:
Jak w przypadku większości innych rozwiązań, nie przeprowadziłem wyczerpujących testów porównawczych, ale działa to wystarczająco dobrze dla moich celów.
źródło
Możemy użyć:
źródło
null
.Znalazłem różne wyniki, które są prawdziwe. Próbuję zastąpić wszystkie białe znaki pojedynczą spacją, a wyrażenie regularne było bardzo wolne.
Najbardziej optymalnie działało dla mnie (w C ++ cli):
Najpierw wypróbowałem powyższą procedurę, zastępując każdą postać osobno, ale musiałem przejść do robienia podciągów dla sekcji spacji. Przy stosowaniu do łańcucha znaków o wartości 1 200 000:
źródło