Я просто подумал, как проще всего заменить строковые символы, которые необходимо заменить впоследствии.
Например:
var str = "[Hello World]";
//enclose all occurences of [ and ] with brackets[]
str = str.Replace("[","[[]").Replace("]","[]]");
[[] Hello World []]
[[[]] Hello World []]
Причина в том, что очевидно, вторая замена уже измененной строки.
Итак, как заменить все вхождения «плохих» символов на символы, содержащие «плохие» символы?
Быстрое измерение всех подходов показало, что StringBuilder является наиболее эффективным способом.
Файл 190 КБ (все в миллисекундах)
regexTime 40.5065 replaceTime 20.8891 StringBuilderTime 6.9776
Файл 7 МБ
regexTime 1209.3529 replaceTime 403.3985 строкаBuilderTime 175.2583
Кстати, прямой подход StringBuilder
из Джона был в два раза быстрее, чем подход Aggregate из Sehe .
Я сделал из него расширение:
public static String EncloseChars(this string input, char[] charsToEnclose, String leftSide, String rightSide) {
if (charsToEnclose == null || leftSide == null || rightSide == null)
throw new ArgumentException("Invalid arguments for EncloseChars", charsToEnclose == null ? "charsToEnclose" : leftSide == null ? "leftSide" : "rightSide");
Array.Sort(charsToEnclose);
StringBuilder sb = new StringBuilder();
foreach (char c in input) {
if (Array.BinarySearch(charsToEnclose, c) > -1)
sb.Append(leftSide).Append(c).Append(rightSide);
else
sb.Append(c);
}
return sb.ToString();
}
"[Hello World]".EncloseChars(new char[]{'[', ']'},"[","]");