这个问题有几个方面需要考虑
过早优化
给出的方法有效且易于理解/维护。它是否导致性能问题?
如果没有问题,则不用担心。如果它曾经引起了问题,则再去看看。
期望结果
在示例中,您想要输出的是什么?
"Did you this asking"
或者
"Did you this asking"
您已经在 "try" 和 "before" 的末尾添加了空格,但是没有添加到 "yourself". 为什么?是打错字了吗?
string.Replace() 区分大小写。如果您关心大小写,您需要修改代码。
使用部分内容很麻烦。
单词在不同的时态下会发生变化。例如,'doing' 中的 'do' 被删除了,但是 'take' 和 'taking' 呢?
停用词的顺序很重要,因为您正在更改输入。可能(我不知道有多大可能性)在更改之前未在输入中出现的单词在更改后“出现”在输入中。您希望每次都返回并重新检查吗?
您真的需要删除部分内容吗?
优化:
当前方法将通过输入字符串 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()方法(修改为使用字符串构建器并忽略大小写)似乎是一个很好的第一步解决方案。在尝试更复杂的内容之前,应在可能的性能条件下进行基准测试。
祝好,
艾伦。