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

LINQ: Строка строки Entity содержит любой массив строк

Я хочу получить коллекцию объектов Product, в которой свойство product.Description содержит любое из слов в массиве строк.

Это выглядело бы примерно так (результатом был бы любой продукт, в слове "горчица ИЛИ" "соленые огурцы" или "смаковать" в тексте описания):

Dim products As List(Of ProductEntity) = New ProductRepository().AllProducts

Dim search As String() = {"mustard", "pickles", "relish"}

Dim result = From p In products _
     Where p.Description.Contains(search) _
     Select p

Return result.ToList

Я уже рассмотрел этот похожий вопрос, но не смог заставить его работать.

4b9b3361

Ответ 1

Поскольку вы хотите увидеть, содержит ли поиск слово, содержащееся в описании p, вам в основном нужно проверить каждое значение в поиске, если оно содержится в описании p

result = from p in products
           where search.Any(val => p.Description.Contains(val))
           select p;

Это синтаксис С# для лямбда-метода, так как мой vb не настолько велик

Ответ 2

Dim result = From p in products _
             Where search.Any(Function(s) p.Description.Contains(s))
             Select p

Ответ 3

Вы можете использовать простой запрос 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)));

Ans From = > Как проверить, не найдено ли какое-либо слово в моем списке <string> содержится в тексте @R. Мартинхо Фернандес