Улучшить String.Insert в .Net? - PullRequest
2 голосов
/ 06 мая 2011

Мне нужно разметить строку с идентификаторами, указывающими начало и конец подстроки, которая прошла тест.

Предположим, у меня есть строка «Быстрая коричневая лиса перепрыгивает через ленивую собаку», и я хотел разметить строку тегом для каждого слова, начинающегося с символов «b» и «o».Последняя строка будет выглядеть так: «Быстрые <tag>brown</tag> скачки лисы <tag>over</tag> ленивая собака».

Используя комбинацию регулярных выражений и LINQ, у меня есть правильная логика для достижения того, чего я хочу, но моя производительностьне то, что я хочу, потому что я использую String.Insert для вставки тегов.Наши строки могут быть очень длинными (> 200 КБ), а количество подстрок для тега может быть близко к сотне.Ниже приведен код, который я использую для вставки тегов.Учитывая, что я знаю начало и длину каждой подстроки, как я могу обновить строку 'input' быстрее?

.ForEach<Match>(m => {
  input = input.Insert(m.Index + m.Length, "</tag>");
  input = input.Insert(m.Index, "<tag>");
});

Ответы [ 4 ]

10 голосов
/ 06 мая 2011

Вы должны использовать StringBuilder.

. Для оптимальной производительности установите емкость StringBuilder перед тем, как что-либо делать, затем добавьте фрагменты исходной строки между тегами.

В качестве альтернативыпереместите вашу логику в MatchEvaluator лямбда-выражение и вызовите RegeEx.Replace.

2 голосов
/ 06 мая 2011

Попробуйте это:

Regex

Regex.Replace("The quick brown fox jumps over the lazy dog", @"(^|\s)([bo]\w*)", "$1<tag>$2</tag>");

Результаты

The quick <tag>brown</tag> fox jumps <tag>over</tag> the lazy dog

Регулярные выражения должны обеспечивать довольно быструю замену. То, является ли этот метод лучшим, зависит от длины строки и от того, сколько работы требуется для того, чтобы на самом деле соответствовать одному из ваших «слов».

1 голос
/ 06 мая 2011

Вы можете использовать RegEx напрямую - у него есть метод Replace, который должен позволять вам вставлять теги вокруг ваших совпадений.

Однако я не могу ручаться за скорость этого. Вы можете скомпилировать RegEx, что должно улучшить производительность, но даже при этом вам нужно будет протестировать ваши конкретные обстоятельства.

1 голос
/ 06 мая 2011

Манипулирование строками заведомо медленное. Вместо этого используйте System.Text.StringBuilder .

Также имеется метод Вставка .

Кроме того, в MSDN есть хорошая статья об улучшении Улучшения производительности обработки строк , которая сравнивает StringBuilder с обычными операциями String. Это стоит прочитать, если вы никогда не сталкивались с этой темой раньше.

...