Мне просто интересно, какой самый простой способ заменить строковые символы, которые должны быть заменены впоследствии.
Например:
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
stringBuilderTime 175.2583
Кстати, прямой StringBuilder
подход от John был в два раза быстрее, чем 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[]{'[', ']'},"[","]");