string から特定のいくつかの文字を消去したい

たとえばある文字列からスペース、タブ、改行を削除したい場合にはどうやって書くんだろう?
Split + Join?

string str2 = string.Join("", str.Split(' ', '\t', '\r', '\n'));

文字列の Replace?

string str2 = str.Replace(" ", "");
str2 = str2.Replace("\t", "");
str2 = str2.Replace("\r", "");
str2 = str2.Replace("\n", "");

IndexOfAny + Remove?

string str2 = str;
int index = 0;
char[] c = new char[] { ' ', '\t', '\r', '\n' };
while ((index = str2.IndexOfAny(c, index)) != -1)
{
    str2 = str2.Remove(index, 1);
}

まあ Remove 使うのはありえないとして、もうちょい発展させて StringBuilder を使ってみるとか?

string str2;
StringBuilder builder = new StringBuilder(str.Length); // このキャパだけあれば再確保は絶対に無い
int old = 0;
int index = 0;
char[] c = new char[] { ' ', '\t', '\r', '\n' };
while ((index = str.IndexOfAny(c, index)) != -1)
{
    builder.Append(str, old, index - old);
    old = ++index;
}
builder.Append(s, old, str.Length - old);
str2 = builder.ToString();

これはさすがにめんどすぎ。
うーん、ある程度の速度と簡潔さを両方持ってるっぽい気のする Split + Join のやり方が一番なのかなぁ……。


C++ の string なら mutable なので、

struct pred { bool operator()(char c) const { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; } };
std::string str2 = str;
str2.erase(std::remove_if(str2.begin(), str2.end(), pred()), str2.end());

これだけで済むんだけど……。
ついでに C++0x なら

std::string str2 = str;
str2.erase(std::remove_if(str2.begin(), str2.end(),
    [](char c) { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; }), str2.end());

こうかな。