Я вызываю REST API и получаю ответ XML обратно. Он возвращает список имен рабочей области, и я пишу быстрый IsExistingWorkspace()
метод. Поскольку все рабочие пространства состоят из непрерывных символов без пробелов, я предполагаю, что самый простой способ выяснить, находится ли конкретное рабочее пространство в списке, это удалить все пробелы (включая переводы строк) и сделать это (XML - это строка, полученная из Интернета. запрос):
XML.Contains("<name>" + workspaceName + "</name>");
Я знаю, что это с учетом регистра, и я полагаюсь на это. Мне просто нужен способ, чтобы эффективно удалить все пробелы в строке. Я знаю, что RegEx и LINQ могут это сделать, но я открыт для других идей. Меня больше всего беспокоит скорость.
c#
removing-whitespace
Кори Огберн
источник
источник
Ответы:
Это самый быстрый способ, который я знаю, даже если вы сказали, что не хотите использовать регулярные выражения:
источник
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
означает «соответствовать любому пустому токену» и+
означает «соответствовать одному или нескольким исходящим токенам». Кроме того, RegExr - хороший сайт для практики написания выражений RegEx, если вы хотите поэкспериментировать.У меня есть альтернативный способ без регулярных выражений, и он, кажется, работает довольно хорошо. Это продолжение ответа Брэндона Морец:
Я проверил это в простом модульном тесте:
Для 1 000 000 попыток первый вариант (без регулярного выражения) выполняется менее чем за секунду (700 мс на моем компьютере), а второй занимает 3,5 секунды.
источник
.ToCharArray()
не обязательно; Вы можете использовать.Where()
непосредственно на строку.ToCharArray
быстрее, чем использование.Where()
непосредственно в строке. Это как-то связано с накладными расходамиIEnumerable<>
в каждом шаге итерации, аToCharArray
их эффективность (block-copy) и компилятор оптимизирует итерацию по массивам. Почему эта разница существует, никто не смог объяснить мне, но измерить, прежде чем удалитьToCharArray()
.Попробуйте заменить метод строки в C #.
источник
Мое решение состоит в том, чтобы использовать Split и Join, и это удивительно быстро, на самом деле самый быстрый из лучших ответов здесь.
Время цикла 10000 на простой строке с пробелами, включая новые строки и вкладки
Улучшите это, обернув его в метод, чтобы придать ему смысл, а также сделайте его методом расширения, пока мы на нем ...
источник
string[]
иchar[]
? Вы просто должны указать , какой из них вы хотите , например:string.Join("", str.Split((string[])null, StringSplitOptions.RemoveEmptyEntries));
. Это именно то, что делает ваш вызовdefault
в этом случае, так как он также возвращаетnull
: он помогает компилятору решить, какую перегрузку выбрать. Отсюда мой комментарий, потому что утверждение в вашем комментарии "Split нужен правильный массив, и null не будет делать ..." является ложным. Ничего страшного, просто стоит упомянуть, поскольку Джейк Дрю спросил, как это работает. +1 за ваш ответstring.Concat("H \ne llo Wor ld".Split())
Опираясь на ответ Хенкса, я создал несколько тестовых методов с его ответом и несколько добавленных, более оптимизированных методов. Я обнаружил, что результаты отличаются в зависимости от размера входной строки. Поэтому я проверил с двумя наборами результатов. В самом быстром способе связанный источник имеет еще более быстрый путь. Но, поскольку это характеризуется как небезопасный, я оставил это.
Длинные входные строки результатов:
Короткие результаты ввода строки:
Код :
Тесты :
Редактировать : Протестирован хороший лайнер из Kernowcode.
источник
Просто альтернатива, потому что это выглядит довольно красиво :) - ПРИМЕЧАНИЕ: ответ Хенкса - самый быстрый из них.
Тестирование 1 000 000 циклов на
"This is a simple Test"
Этот метод = 1,74 секунды,
регулярное выражение = 2,58 секунды
new String
(Хенкс) = 0,82источник
Я нашел хорошую статью об этом в CodeProject Фелипе Мачадо (с помощью Ричарда Робертсона )
Он проверил десять разных методов. Это самая быстрая и небезопасная версия ...
И самая быстрая безопасная версия ...
Есть также несколько хороших независимых тестов переполнения стека от Stian Standahl, которые также показывают, что функция Felipe примерно на 300% быстрее, чем следующая самая быстрая функция.
источник
Если вам нужна превосходная производительность, в этом случае следует избегать LINQ и регулярных выражений. Я провел некоторое тестирование производительности, и кажется, что если вы хотите убрать пробел из начала и конца строки, string.Trim () - ваша конечная функция.
Если вам нужно убрать все пробелы из строки, следующий метод работает быстрее всего, что было опубликовано здесь:
источник
Регулярное выражение является излишним; просто используйте расширение на строку (спасибо Хенк). Это тривиально и должно было быть частью структуры. Во всяком случае, вот моя реализация:
источник
System.Linq
Вот простая линейная альтернатива решению RegEx. Я не уверен, что быстрее; Вы должны были бы сравнить это.
источник
Мне нужно было заменить пробел в строке пробелами, но не дублировать пробелы. например, мне нужно было преобразовать что-то вроде следующего:
в
Я использовал следующий метод
источник
Я предполагаю, что ваш XML-ответ выглядит так:
Лучший способ обработки XML - использовать синтаксический анализатор XML, например LINQ to XML :
источник
Вот еще один вариант:
Как и с большинством других решений, я не проводил исчерпывающих тестов производительности, но для моих целей это работает достаточно хорошо.
источник
Мы можем использовать:
источник
null
.Я нашел разные результаты, чтобы быть правдой. Я пытаюсь заменить все пробелы одним пробелом, и регулярное выражение было очень медленным.
Что сработало для меня наиболее оптимально (в C ++ cli):
Сначала я попробовал описанную выше процедуру, заменив каждый символ отдельно, но мне пришлось переключиться на выполнение подстрок для непробельных разделов. При применении к строке 120000 символов:
источник