![](/img/trans.png)
[英]How can I use Linq and c# to compare a property against a List<string>
[英]How can I compare a string to a “filter” list in 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()
过滤列表中至少有一个单词的句子,可以使用String.Split()
和Enumerable.Intersect
:
var items = foo.Where(sentence => !sentence.Split().Intersect(filter).Any());
Enumerable.Intersect
非常有效,因为它在引擎盖下使用了Set
。 将长序列放在首位更有效。 由于Linq的延迟执行是在第一个匹配的单词上停止。
(请注意,“空” Split
包括其他空白字符,如制表符或换行符)
你需要解决的第一个问题是将句子分成一系列单词。 最简单的方法是基于空格
string[] words = sentence.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
从那里你可以使用一个简单的LINQ表达式来找到亵渎
var badWords = words.Where(x => filter.Contains(x));
然而,这是一个原始的解决方案。 它不会处理您可能需要考虑的许多复杂情况
' '
dog!
不会被视为dog
。 打破法律角色的话可能要好得多 你的初步尝试不起作用的原因是这一行:
(from f in filter select f).ToString()
求值为linq表达式部分隐含的Array Iterator类型名称的字符串。 所以你实际上是在比较以下字符串的字符:
System.Linq.Enumerable+WhereSelectArrayIterator``2[System.String,System.String]
而不是在检查你的短语时过滤器的话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.