我有一个
List<string> words = new List<string> {"word1", "word2", "word3"};
如果我的字符串包含任何这些单词,我想检查使用linq; Smthng喜欢:
var q = myText.ContainsAny(words);
第二,如果我也有句子列表:
List<string> sentences = new List<string> { "sentence1 word1" , "sentence2 word2" , "sentence3 word3"};
并且还要检查这些句子中是否包含任何这些单词!
var q = sentences.Where(s=>words.Any(s.text))....
答案 0 :(得分:43)
如果您需要检查子字符串,则可以使用简单的LINQ查询:
var q = words.Any(w => myText.Contains(w));
// returns true if myText == "This password1 is weak";
如果要检查整个单词,可以使用正则表达式:
与正则表达式匹配,这是所有单词的分离:
// you may need to call ToArray if you're not on .NET 4
var escapedWords = words.Select(w => @"\b" + Regex.Escape(w) + @"\b");
// the following line builds a regex similar to: (word1)|(word2)|(word3)
var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")");
var q = pattern.IsMatch(myText);
将字符串拆分为带有正则表达式的单词,并测试单词集合的成员资格(如果您将单词变为HashSet
而不是List
,这会更快) :
var pattern = new Regex(@"\W");
var q = pattern.Split(myText).Any(w => words.Contains(w));
为了根据此标准过滤句子集合,您只需将其置于函数中并调用Where
:
// Given:
// bool HasThoseWords(string sentence) { blah }
var q = sentences.Where(HasThoseWords);
或者把它放在一个lambda:
var q = sentences.Where(s => Regex.Split(myText, @"\W").Any(w => words.Contains(w)));
答案 1 :(得分:5)
var q = words.Any(w => myText.Contains(w));
返回包含1个或多个单词的所有句子:
var t = sentences.Where(s => words.Any(w => s.Contains(w)));
foreach (var sentence in t)
{
Console.WriteLine(sentence);
}
答案 2 :(得分:2)
第一个条件
List<string> words = new List<string> { "word1", "word2", "word3" };
string test = "word1";
bool isFound = words.Contains(test);
第二个条件
bool isFound = sentences.Any(x => x.Split(new char[] { ' ' }).Contains(test));
作为无关的旁注
在获得答案后,您正在更改问题的范围,这不是提问的好方法。 :)
答案 3 :(得分:2)
虽然提供的大多数解决方案都是可用的(全部调用Contains
,这将为您提供所需的解决方案),但如果列表和文本很大,则可能会出现性能问题。
从陈述的问题来看,我认为你在空格或任何其他除数之间称呼一个单词。因此,我建议您将myText
拆分为单词列表,并将每个单词与单词列表进行比较,现在使用包含。
当然,这种方式更复杂;您必须确保正确分割单词 - 但是使用较大的字符串(例如,文本文件)可能会有一些性能提升。