var sIn = "1 2\t3";
// Первый способ
var sOut1 = new String(sIn.Select(ch => {switch(ch)
{
case '\t': return ' ';
case '\n': return ' ';
default: return ch;
}
}).ToArray());
// Второй способ
var sOut2 = String.Concat(sIn.Select(ch => {switch(ch)
{
case '\t': return ' ';
case '\n': return ' ';
default: return ch;
}
}));
Хоть это и выглядит очень страшно, но вот мои аргументы:
- при использовании Replace происходит полный просмотр строки и создание новой строки. При увеличении количества заменяемых символов - увеличивается число просмотров строки:
"1 2\t3".replace("\t", " ").replace("\n", " "); - два просмотра строки и два создания строки
"1 2\t3".replace("\t", " ").replace("\n", " ").replace("|", " "); - три просмотра строки и три создания строки
- в моём варианте, вне зависимости от количества заменяемых символов просмотр строки происходит только один раз, и один раз создаётся строка. Для расширения проверяемых символов - нужно просто добавить case.
Хотите более понятно, пожалуйста:
var sIn = "1 2\t3";
var sb = new StringBuilder(sIn.Length);
foreach(var ch in sIn)
{
switch(ch)
{
case '\t':
case '\n':
sb.Append(' ');
break;
default:
sb.Append(ch);
break;
}
};
var sOut = sb.ToString();