Подтвердить что ты не робот

Как проверить, содержит ли какое-либо слово в моем списке <строкa> в тексте

У меня есть

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

И я хочу проверить использование linq, если в моей строке содержится ЛЮБОЙ из этих слов; См. Так:

var q = myText.ContainsAny(words);

И второе, если у меня также есть список предложений:

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

а также neet, чтобы проверить, содержит ли какое-либо из этих предложений какое-либо из этих слов!

 var q = sentences.Where(s=>words.Any(s.text))....
4b9b3361

Ответ 1

Вы можете использовать простой запрос 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);
    
  • Разделение строки на слова с регулярным выражением и тестирование для членства в коллекции слов (это будет быстрее, если вы используете make-слова в 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);

Или поставьте его в лямбда:

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

Ответ 2

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);
            }

Ответ 3

В то время как большинство представленных решений являются функциональными (весь вызов Contains, который даст вам желаемое решение), если список и текст являются большими, могут возникнуть проблемы с производительностью.

Из изложенной проблемы я думаю, что вы называете слово чем угодно между пробелами или любым другим делителем. Поэтому я бы порекомендовал вам разделить ваш myText на список слов и сравнить каждый из них с вашим списком слов, теперь с использованием содержит.

Это намного сложнее, конечно; Вы должны были бы правильно разделить слова - но с большими строками (например, текстовым файлом) может быть некоторое увеличение производительности.

Ответ 4

Для вашего первого условия

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));

Как несвязанная боковая заметка

Вы меняете сферу вопросов после получения ответов, и это не очень хороший способ задать вопросы.:)