C# - 在另一个字符串中查找一组字符串之一的最快方法

sur*_*lit 6 .net c# regex string

我需要检查字符串是否包含任何脏话.

根据另一个问题的一些建议,我创建了一个包含以下单词的HashSet:

HashSet<string> swearWords = new HashSet<string>() { "word_one", "word_two", "etc" };
Run Code Online (Sandbox Code Playgroud)

现在我需要查看swearWords我的字符串中是否包含任何值.

我已经看到它反过来了,例如:

swearWords.Contains(myString)
Run Code Online (Sandbox Code Playgroud)

但这将失败.

查看HashSet中是否有任何单词的最快方法是myString什么?

注意:我想我可以使用foreach循环依次检查每个单词,如果找到匹配则中断,我只是想知道是否有更快的方法.

Spr*_*gue 10

如果您将发誓放在IEnumerable <>实现容器中:

var containsSwears = swarWords.Any(w => myString.Contains(w));
Run Code Online (Sandbox Code Playgroud)

注意:HashSet <>实现IEnumerable <>

  • `HashSet <T>`实现`IEnumerable <T>`.(如果你使用这种方法,你需要注意斯肯索普问题:http://en.wikipedia.org/wiki/Scunthorpe_problem) (3认同)

McG*_*gle 7

你可以试试一个正则表达式,但我不确定它是否更快.

Regex rx = new Regex("(" + string.Join("|", swearWords) + ")");
rx.IsMatch(myString)
Run Code Online (Sandbox Code Playgroud)

  • +1 - 发誓单词最好被描述为正则表达式.我是在谈论我的经历.但是,使用静态算法和单词列表实际上不可能击败用户. (2认同)

dvv*_*vrd 7

如果你有大量的咒骂词,你可以使用Aho-Corasick算法:http://tomasp.net/blog/ahocorasick.aspx