我正在尝试通过"过滤器"列表过滤字符串集合...一系列不良单词.该字符串包含我不想要的列表中的单词.
我到目前为止,这里的坏词是"frakk":
string[] filter = { "bad", "words", "frakk" };
string[] foo =
{
"this is a lol string that is allowed",
"this is another lol frakk string that is not allowed!"
};
var items = from item in foo
where (item.IndexOf( (from f in filter select f).ToString() ) == 0)
select item;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,为什么呢?
你可以使用Any+ Contains:
var items = foo.Where(s => !filter.Any(w => s.Contains(w)));
Run Code Online (Sandbox Code Playgroud)
如果你想比较不区分大小写:
var items = foo.Where(s => !filter.Any(w => s.IndexOf(w, StringComparison.OrdinalIgnoreCase) >= 0));
Run Code Online (Sandbox Code Playgroud)
更新:如果您想要排除过滤列表中至少有一个单词的句子,您可以使用String.Split()和Enumerable.Intersect:
var items = foo.Where(sentence => !sentence.Split().Intersect(filter).Any());
Run Code Online (Sandbox Code Playgroud)
Enumerable.Intersect非常有效,因为它使用Set引擎盖下.将长序列放在首位更有效.由于Linq的延迟执行是在第一个匹配的单词上停止.
(请注意,"空" Split包括其他空白字符,如制表符或换行符)