2015-07-06 7 views
13

Wie kann ich in LINQ nach ganzen Wörtern suchen?Vollständige Wortsuche in LINQ

Wenn ich nach einem Wort "Auto" in einer Liste von Strings {"carpenter","car repair","carrying","car workshop"} usw. suchen, und das Ergebnis sollte "Auto-Reparatur" sein & "Autowerkstatt" nur. ich versucht, den Code unten

List<string> _tags = (from item in string_array 
           where item.ToLower().Contains(search_term) 
           select item).ToList(); 

Aber, enthält Rückkehr immer ähnliche Wörter und ich fand diesen Link auf SO Linq Regex for whole word search , die eine vollständige Antwort mit REGx nicht bereitstellt.

Also, jeder kann helfen, eine Antwort in Regx zu schreiben oder ist eine andere Option mit Linq zu verwenden.

+0

@ SonerGönül, was mit 'Auto zu tun,'? –

+0

@AlexSikilinda Fail, natürlich. –

+0

Hinzufügen von 'item.ToLower(). Split ('') .Length> 1 'zu der' where' -Klausel ergibt, was Sie wollen, aber offensichtlich ist es keine Lösung. –

Antwort

17

Try this:

var result = items.Where(i => i.Split(' ').Any(word => word.ToLower() == "car")).ToList(); 

Wenn Sie berücksichtigen Kommas nehmen benötigen, können Sie diese stattdessen verwenden können:

var reg = new Regex("\\bcar\\b", RegexOptions.IgnoreCase); 

var items = new [] { "carpenter", "car repair", "carrying", "car workshop", "car, repair", "car. repair", "car,repair" }; 
var result = items.Where(word => reg.IsMatch(word)).ToList(); 

Gibt:

car repair 
car workshop 
car, repair 
car. repair 
car,repair 
+1

wieder, wird nicht mit Kommas arbeiten –

+0

Sie haben die gleiche Sache wie ich getan, aber es könnte genauer sein, um das gleiche zu erreichen. :) –

+0

@AlexSikilinda Jetzt ist es :) – Rob

1

Ich würde nur schauen für ein Leerzeichen vor und nach Suchwort.

List<string> _tags = string_array.Where(
     s => s.ToUpper().Contains(" " + search_term.ToUpper()) || 
     sToUpper().Contains(search_term.ToUpper() + " ") || s.ToUpper == search_term.ToUpper()).ToList(); 
+0

Wir können es nicht an, Da es nicht Sätze beginnend mit Wort Beispiel betrachten: Automechaniker und wenn wir Platz vor und nach Auto hinzufügen "Auto" gleich ist der Fall Satz endet mit Wort –

+0

Hier wählen wir alle Zeichenfolge, die mindestens hat einer von: (ich werde Räume mit Unterstrichen für Klarheit ersetzen): 'Auto' 'car_' '_car'. Für eine Liste von Werten {"Automechaniker", "Auto", "Carbon", "schwarzes Auto"} wird es 3 von ihnen treffen - alle außer "Kohlenstoff". – Fabjan

2
list.Where(item=>item.Split(' ').Contains("car")); 
1
var strResult = strings.Where(x => x.Split(' ').Any(y => y.Equals("car"))).ToList(); 
+0

Können wir es tun ??? , Da es Sätze nicht berücksichtigt, die mit dem Wort beginnen Beispiel: Automechaniker und wenn wir Raum vor und nach dem Auto "Auto" hinzufügen, ist der gleiche Fall der Satz endet mit dem Wort - –

2

können Sie wie folgt vorgehen:

  • Split jedes Element im Array auf weißen Platz string.Split()
  • Suche nach dem Wort ContainsStringComapareroverload
  • mit Verwendung mit

mag:

string[] string_array = {"carpenter", "car repair", "carrying", "car workshop"}; 
string word = "car"; 
List<string> _tags = string_array.Where(r => r.Split() 
           .Contains(word, StringComparer.InvariantCultureIgnoreCase)) 
            .ToList(); 

Zur Ausgabe:

foreach (var item in _tags) 
{ 
    Console.WriteLine(item); 
} 

Ausgabe wäre:

car repair 
car workshop 
Verwandte Themen