2011-08-09 9 views
3

Comment puis-je savoir si une chaîne contient le mot exact que je recherche? Exemple: "ceci est mon texte"; mot recherchant: "texte"; trouvé: oui. Exemple: "ce sont mes textes"; mot recherchant: "texte"; trouvé: non.Trouver un mot exact dans une chaîne

  • C'est dans une requête linq to entities, donc regex ne fonctionnera pas?

Edit:

Ceci est plus ou moins ce que je fais maintenant et je veux le remplacer par une fonction qui retourne seulement quand il est le match exact.

using (Model.Manager ctx = new Model.Manager()) 
    { 
     var result = from p in ctx.Companies where p.Name.Contains(workLookingFor) select p;   
    } 

Solution jusqu'à présent: sur mon DB et utiliser RegEx sur les résultats tirés de la DB

je pouvais utiliser .Contains(). Puisque les correspondances exactes sont toujours dans les résultats plus larges de .Contains() (dont j'ai toujours besoin de toute façon) cela pourrait être une bonne solution.

+0

Pourriez-vous développer un peu sur Linq2Entities, comme un exemple de code? – nicodemus13

+0

Vous ne pouvez pas utiliser '.Select()' avec Regex match, et '\ btext \ b' patttern? –

+0

@ Brad Christie, voir mon commentaire à la réponse de Tim Roger. – Jeroen

Répondre

1

Il n'y a pas un moyen facile. Vous disposez de trois options

+0

Yuk. Mais tu m'as donné une idée. Je pourrais utiliser .Contains() sur ma base de données et utiliser RegEx sur les résultats tirés de la base de données. Puisque les correspondances exactes sont toujours dans les résultats plus larges de .Contains() (dont j'ai toujours besoin de toute façon) cela pourrait être une bonne solution. – Jeroen

+0

Un très bon compromis. –

2

Cela fonctionne pour moi. Ce n'est pas parfait mais pourrait aider.

public static bool matchWholeWord(string test, string search) 
     { 
      var index = test.IndexOf(search); 
      if (index == -1) 
       return false; 

      var after = index + search.Length; 
      if (after == test.Length) 
       return true; 

      return !char.IsLetterOrDigit(test[after]); 
     } 

dans votre code:

using (Model.Manager ctx = new Model.Manager()) 
    { 
     var result = from p in ctx.Companies 
     where matchWholeWord(p.Name, workLookingFor) 
     select p;   
    } 
+0

Comment cela fonctionnerait-il sur 200 000 enregistrements avec 3 champs de texte et plusieurs mots à rechercher? – Jeroen

+0

À mon avis très bien. – Mehran

+0

C'est pratique. Avoir un upvote bon monsieur – CountMurphy

0

je devais utiliser quelque chose de semblable à cela pour mettre en œuvre un algorithme de recherche en utilisant LINQ récemment. J'ai trouvé l'article MSDN sur la combinaison LINQ and Regular Expressions pour être utile, avec une expression régulière qui a utilisé le marqueur d'espace pour identifier les espaces. En construisant la regex avec mes paramètres de recherche et en combinant cela dans mon expression LINQ, j'ai fini avec ce dont j'avais besoin.

+0

LINQ to Entities ne reconnaît pas la méthode 'System.Text.RegularExpressions.MatchCollection Matches (System.String)' méthode, et cette méthode ne peut pas être traduite en une expression de magasin – Jeroen

+0

Il est regrettable que LINQ to Entities a cette comportement. Bonne chance. – Julian

Questions connexes