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ć.
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
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
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:
-
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);
-
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 aList
):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
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