Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
375 views
in Technique[技术] by (71.8m points)

c# - How to check if any word in my List<string> contains in text

I have a

List<string> words = new List<string> {"word1", "word2", "word3"};

And i want to check using linq if my string contains ANY of these words; Smthng like:

var q = myText.ContainsAny(words);

And the second, if i have a list of sentences too:

List<string> sentences = new List<string> { "sentence1 word1" , "sentence2 word2" , "sentence3 word3"};

and also neet to check if any of these sentence contains any of these words!

 var q = sentences.Where(s=>words.Any(s.text))....
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use a simple LINQ query, if all you need is to check for substrings:

var q = words.Any(w => myText.Contains(w));
// returns true if myText == "This password1 is weak";

If you want to check for whole words, you can use a regular expression:

  1. Matching against a regular expression that is the disjunction of all the words:

    // you may need to call ToArray if you're not on .NET 4
    var escapedWords = words.Select(w => @"" + Regex.Escape(w) + @"");
    // the following line builds a regex similar to: (word1)|(word2)|(word3)
    var pattern = new Regex("(" + string.Join(")|(", escapedWords) + ")");
    var q = pattern.IsMatch(myText);
    
  2. Splitting the string into words with a regular expression, and testing for membership on the words collection (this will get faster if you use make words into a HashSet instead of a List):

    var pattern = new Regex(@"W");
    var q = pattern.Split(myText).Any(w => words.Contains(w));
    

In order to filter a collection of sentences according to this criterion all you have to do is put it into a function and call Where:

 // Given:
 // bool HasThoseWords(string sentence) { blah }
 var q = sentences.Where(HasThoseWords);

Or put it in a lambda:

 var q = sentences.Where(s => Regex.Split(myText, @"W").Any(w => words.Contains(w)));

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...