web-dev-qa-db-fra.com

LINQ: le champ de chaîne d'entité contient n'importe quel tableau de chaînes

Je souhaite obtenir une collection d'entités Product où la propriété product.Description contient l'un des mots d'un tableau de chaînes.

Cela ressemblerait à quelque chose comme ceci (le résultat serait n'importe quel produit qui avait le mot "moutarde OR" cornichons "OR" relish "dans le texte de 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

J'ai déjà regardé cette question similaire mais je n'ai pas pu le faire fonctionner.

37
Steve Macdonald

Puisque vous voulez voir si la recherche contient un mot qui est contenu dans la description de p, vous devez essentiellement tester chaque valeur dans la recherche si elle est contenue dans la description de p

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

Il s'agit de la syntaxe c # pour la méthode lambda car mon vb n'est pas si génial

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

Vous pouvez utiliser une simple requête LINQ, si tout ce dont vous avez besoin est de vérifier les sous-chaînes:

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

Si vous souhaitez rechercher des mots entiers, vous pouvez utiliser une expression régulière:

  1. Correspondance avec une expression régulière qui est la disjonction de tous les mots:

    // 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. Fractionner la chaîne en mots avec une expression régulière et tester l'appartenance à la collection de mots (cela deviendra plus rapide si vous utilisez créer des mots dans un HashSet au lieu d'un List):

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

Pour filtrer une collection de phrases selon ce critère, il suffit de la mettre dans une fonction et d'appeler Where:

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

Ou mettez-le dans un lambda:

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

Ans From => Comment vérifier si un mot dans ma liste <chaîne> contient du texte par @R. Martinho Fernandes

5
Nilesh Moradiya