c# - 如何将字符串与 linq 中的 "filter"列表进行比较?

标签 c# linq

我正在尝试通过“过滤器”列表来过滤字符串集合……坏词列表。该字符串包含列表中的一个词,我不想要它。

到目前为止,这里的坏词是“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;

但这行不通,为什么?

最佳答案

您可以使用Any + Contains:

var items = foo.Where(s => !filter.Any(w => s.Contains(w)));

如果你想不区分大小写地比较:

var items = foo.Where(s => !filter.Any(w => s.IndexOf(w, StringComparison.OrdinalIgnoreCase) >= 0));

更新:如果您想排除过滤器列表中至少有一个 的句子,您可以使用String.Split()Enumerable.Intersect:

var items = foo.Where(sentence => !sentence.Split().Intersect(filter).Any());

Enumerable.Intersect非常高效,因为它在底层使用了一个Set。将长序列放在第一位效率更高。由于 Linq 的延迟执行会在第一个匹配的单词处停止。

(请注意,“空”Split 包括其他空白字符,如制表符或换行符)

关于c# - 如何将字符串与 linq 中的 "filter"列表进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17890793/

相关文章:

c# - 为什么 Browsable 属性使属性不可绑定(bind)?

c# - 是否可以在不使用连接器的情况下将 C# 变量包含在字符串变量中?

c# - SQL to LINQ with Case .. When in Order By

c# - 在 LINQ 查询中填充对象数组

asp.net-mvc - 获取在 Identity 2 中分配角色的用户列表

c# - 我如何知道字符串是否代表有效的 MIME 类型?

c# - 在CodeBehind中获取ListViewItem控件

c# - 如何使用 DryIOC 解决使用父层级接口(interface)

c# - 没有对的单独记录

c# - 断言 A 中的所有内容都属于 B,B 中的所有内容都属于 A