Это забавно, но на моем ПК описанный ниже метод такой же быстрый, как и подход StringBulder Сергея Поваляева - (~ 282 мс для 1000 повторений, 10 тыс. Строк src).Не уверен насчет использования памяти.
string RemoveExtraWhiteSpace(string src, char[] wsChars){
return string.Join(" ",src.Split(wsChars, StringSplitOptions.RemoveEmptyEntries));
}
Очевидно, что он работает нормально с любыми символами - не только с пробелами.
Хотя это не то, что запросил ОП - но если это то, что вам действительно нужночтобы заменить определенные последовательные символы в строке только одним экземпляром, вы можете использовать этот относительно эффективный метод:
string RemoveDuplicateChars(string src, char[] dupes){
var sd = (char[])dupes.Clone();
Array.Sort(sd);
var res = new StringBuilder(src.Length);
for(int i = 0; i<src.Length; i++){
if( i==0 || src[i]!=src[i-1] || Array.BinarySearch(sd,src[i])<0){
res.Append(src[i]);
}
}
return res.ToString();
}