Product.Descriptionプロパティに文字列配列内の任意の単語が含まれるProductエンティティのコレクションを取得したい。
これは次のようになります(結果は、説明テキストに「mustard OR "pickles" OR "relish"」という単語が含まれる製品になります)。
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
私はすでに この同様の質問 を見ましたが、動作させることができませんでした。
検索にpの説明に含まれるWordが含まれているかどうかを確認するため、基本的に検索の各値がpの説明に含まれているかどうかをテストする必要があります。
result = from p in products
where search.Any(val => p.Description.Contains(val))
select p;
私のVBはそれほど優れていないため、これはラムダメソッドのC#構文です
Dim result = From p in products _
Where search.Any(Function(s) p.Description.Contains(s))
Select p
必要なのが部分文字列を確認するだけであれば、簡単な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);
正規表現を使用して文字列を単語に分割し、単語コレクションのメンバーシップをテストします(単語を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)));
回答元=> リスト<string>内の単語にテキストが含まれているかどうかを確認する方法 by @R。マルティーニョ・フェルナンデス