38

product.Description プロパティに文字列配列の単語が含まれている Product エンティティのコレクションを取得したいと考えています。

これは次のようになります (結果は、説明テキストに「マスタード」または「ピクルス」または「レリッシュ」という単語が含まれる製品になります):

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

私はすでにこの同様の質問を見ましたが、うまくいきませんでした。

4

3 に答える 3

93

検索に p の説明に含まれる単語が含まれているかどうかを確認したいので、基本的に、検索の各値について、p の説明に含まれているかどうかをテストする必要があります。

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

私のvbはそれほど優れていないため、これはラムダメソッドのc#構文です

于 2009-11-18T16:27:24.060 に答える
6
Dim result = From p in products _
             Where search.Any(Function(s) p.Description.Contains(s))
             Select p
于 2009-11-18T16:24:37.397 に答える
5

部分文字列を確認するだけでよい場合は、単純な LINQ クエリを使用できます。

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

単語全体をチェックしたい場合は、正規表現を使用できます。

  1. すべての単語の論理和である正規表現との照合:

    // 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. 正規表現を使用して文字列を単語に分割し、単語コレクションのメンバーシップをテストします (単語を a のHashSet代わりに a にすると高速になります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 => List<string> 内の単語が@Rのテキストに含まれているかどうかを確認する方法。マルティニョ・フェルナンデス

于 2013-07-12T09:22:35.677 に答える