这有几个方面
过早的优化
给出的方法有效并且易于理解/维护。它会导致性能问题吗?如果没有,那就不用担心了。如果它曾经导致问题,那么看看它。
预期结果
在示例中,您希望输出是什么?
"Did you this asking"
或者
"Did you this asking"
您已经在“try”和“before”的末尾添加了空格,但没有在“yourself”的末尾添加空格。为什么?错字?
string.Replace() 区分大小写。如果您关心大小写,则需要修改代码。
使用 partials 很麻烦。
单词在不同的时态中变化。从“doing”词中删除“do”的例子,但是“take”和“take”呢?停用词的顺序很重要,因为您正在更改输入。有可能(我不知道有多大可能但有可能)在更改之前不在输入中的单词在更改之后“出现”在输入中。你想每次都回去重新检查吗?
你真的需要删除部分吗?
优化
当前方法将通过输入字符串 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 处理部分会变得很麻烦,但如果我们只想要一次通过(不检查“发现的”单词)就可以工作
[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() 方法(修改为使用字符串生成器并且不区分大小写)看起来是一个很好的首选解决方案。在尝试更复杂的事情之前,我会在可能的性能条件下对其进行基准测试。
嗯,
艾伦。