これにはいくつかの側面があります
時期尚早の最適化
与えられた方法は機能し、理解/維持が容易です。パフォーマンスの問題を引き起こしていますか?そうでない場合は、心配しないでください。問題が発生した場合は、それを確認してください。
期待される結果
この例では、出力をどのようにしますか?
"Did you this asking"
また
"Did you this asking"
「try」と「before」の最後にスペースを追加しましたが、「yourself」は追加していません。なんで?打ち間違え?
string.Replace()では大文字と小文字が区別されます。ケーシングが気になる場合は、コードを変更する必要があります。
パーシャルの操作は面倒です。
言葉は時制が異なります。「do」が「doing」の単語から削除された例ですが、「take」と「takeing」はどうですか?入力を変更するため、ストップワードの順序が重要になります。変更前に入力に含まれていなかった単語が、変更後に入力に「表示される」可能性があります(可能性はわかりませんが可能です)。毎回戻って再確認しますか?
本当にパーシャルを削除する必要がありますか?
最適化
現在の方法は、入力文字列をn回処理します。ここで、nは編集される単語の数であり、置換が発生するたびに新しい文字列を作成します。これは遅いです。
StringBuilder(上記のakatakritos)を使用すると、速度が上がるので、最初にこれを試してみます。再テストして、これで十分な速度になるかどうかを確認します。
Linqを使用できます
編集
デモのために''で分割するだけです。句読点も考慮して、句読点をどうするかを決める必要があります。
編集終了
[TestMethod]
public void RedactTextLinqNoPartials() {
var arrToCheck = new string[] { "try", "yourself", "before" };
var input = "Did you try this yourself before asking";
var output = string.Join(" ",input.Split(' ').Where(wrd => !arrToCheck.Contains(wrd)));
Assert.AreEqual("Did you this asking", output);
}
すべての単語全体(およびスペース。単語が削除された場所を確認することはできません)を削除しますが、ベンチマークがなければ、より高速であるとは言えません。
linqを使用したパーシャルの処理は面倒になりますが、パスが1つだけの場合は機能します(「検出された」単語のチェックは不要)
[TestMethod]
public void RedactTextLinqPartials() {
var arrToCheck = new string[] { "try", "yourself", "before", "ask" };
var input = "Did you try this yourself before asking";
var output = string.Join(" ", input.Split(' ').Select(wrd => {
var found = arrToCheck.FirstOrDefault(chk => wrd.IndexOf(chk) != -1);
return found != null
? wrd.Replace(found,"")
: wrd;
}).Where(wrd => wrd != ""));
Assert.AreEqual("Did you this ing", output);
}
これを見るだけで、string.Replace()よりも遅いと言えますが、いくつかの数値がないとわかりません。それは間違いなくもっと複雑です。
結論String.Replace
()アプローチ(文字列ビルダーを使用し、大文字と小文字を区別しないように変更)は、優れたファーストカットソリューションのように見えます。より複雑なことを試す前に、可能性のあるパフォーマンス条件下でベンチマークを行います。
hth、
アラン。