私は指定した文字以外のすべての文字を置き換える方法があります。例えば、Inverse String.Replace - それをより速く行う方法?
ReplaceNot("test. stop; or, not", ".;/\\".ToCharArray(), '*');
は今
"****.*****;***,****".
を返します、これは時期尚早の最適化のインスタンスではありません。私はネットワーク操作中にこのメソッドをかなり数回呼び出します。長い文字列では待ち時間があり、それを取り除くと少し助けになることがわかった。これをスピードアップするための助けをいただければ幸いです。
public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
int index = 0;
int old = -1;
StringBuilder sb = new StringBuilder(original.Length);
while ((index = original.IndexOfAny(pattern, index)) > -1)
{
sb.Append(new string(replacement, index - old - 1));
sb.Append(original[index]);
old = index++;
}
if (original.Length - old > 1)
{
sb.Append(new string(replacement, original.Length - (old + 1)));
}
return sb.ToString();
}
ファイナル# 's。また、3Kの文字列のテストケースを追加し、1Mの代わりに100K回実行して、これらのスケールのそれぞれがどれほど優れているかを確認しました。唯一の驚きは、正規表現が他のものより「より良いスケール」ということでしたが、そもそも非常に遅いので、それは何の助けではありません:
User Short * 1M Long * 100K Scale John 319 2125 6.66 Luke 360 2659 7.39 Guffa 409 2827 6.91 Mine 447 3372 7.54 DirkGently 1094 9134 8.35 Michael 1591 12785 8.04 Peter 21106 94386 4.47
アップデート:私はピーターのバージョンの正規表現の作成を行いました静的変数、かつ公正であることをRegexOptions.Compiledに設定します。
User Short * 1M Long * 100K Scale Peter 8997 74715 8.30私のテストコードに
ペーストビンリンクそれが間違っている場合、私を修正してください: http://pastebin.com/f64f260ee
「pattern.Contains(original [i])== false」を変更してください。 replacement:original [i] '〜' pattern.Contains(original [i])? original [i]:replacement'。 boolの式をtrue/falseと比較する必要はなく、通常は悪い形式とみなされます。 –
私はこれらすべてのバージョンのスピードテストを実行しています。最新の編集は実際にはそれらの中で最も遅いですが、どのように結果が4倍速くなっていますか? –
@john、私はテストを実行しながらウェブページをリロードするような何かを台無しにしないことを望んで、私はそれらを再チェックしています:) – esac