LINQ: pole entity string zawiera dowolną tablicę łańcuchów

Chcę uzyskać zbiór jednostek produktu, gdzie produkt.Właściwość Description zawiera dowolne ze słów w tablicy łańcuchowej.

Wyglądałoby to mniej więcej tak (wynikiem byłby każdy produkt, który w opisie miał słowo "musztarda "lub" ogórki "lub" Rozkosz"):

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

Przejrzałem już to podobne pytanie , ale nie mogłem go uruchomić.

Author: Community, 2009-11-18

3 answers

Ponieważ chcesz sprawdzić, czy search zawiera słowo, które jest zawarte w opisie p, w zasadzie musisz sprawdzić dla każdej wartości w wyszukiwaniu, jeśli jest ona zawarta w opisie P

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

To jest składnia c# Dla metody lambda ponieważ mój vb nie jest taki wielki

 81
Author: Grizzly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-18 16:27:24
Dim result = From p in products _
             Where search.Any(Function(s) p.Description.Contains(s))
             Select p
 6
Author: jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-18 17:00:38

Możesz użyć prostego zapytania LINQ, jeśli potrzebujesz tylko sprawdzić podcięcia:

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

Jeśli chcesz sprawdzić całe słowa, Możesz użyć wyrażenia regularnego:

  1. Dopasowanie do wyrażenia regularnego, które jest dysjunkcją wszystkich słów:

    // 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);
    
  2. Dzielenie ciągu znaków na słowa za pomocą wyrażenia regularnego i testowanie członkostwa w kolekcji słów (będzie to szybsze, jeśli użyjesz make words into a HashSet zamiast a List):

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

Aby przefiltrować zbiór zdań zgodnie z tym kryterium wystarczy go umieścić w funkcji i wywołać Where:

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

Lub umieścić go w lambda:

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

Ans From = > Jak sprawdzić, czy jakieś słowo na mojej liście zawiera w tekście by @R. Martinho Fernandes

 4
Author: Nilesh Moradiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:39