2012-07-19 14 views
7

Ich habe versucht, das Problem den ganzen Tag zu lösen, und habe keine Lösung gefunden, die wirklich funktioniert. Wenn ich nach Daten suche, möchte ich die Daten anhand mehrerer Wörter herausfiltern.LINQ Abfrage mit mehreren Wörtern

Mein Eingabewert wird unter Verwendung der Standard .Split-Funktion aufgeteilt.

string[] searchstrings = MessageResult.Split(' '); 

Ich habe eine Abfrage gemacht (die offensichtlich nicht richtig funktioniert), die alle Eingaben, um herauszufiltern versucht, die jede Zeichenfolge in searchstrings übereinstimmt.

    var suggestions = (from a in query 
           from w in searchstrings 
           where a.Message.ToLower().Contains(w.ToLower()) 
           select a).Distinct(); 

Abfrage ist meine Variable, die alle Daten enthält. Wie kann ich diese Abfrage so einrichten, dass nur Einträge gefunden werden, die jede Zeichenfolge in Suchstrings enthalten?

+0

Um zu verdeutlichen, wollen Sie die Zeichenfolgen aus der Abfrage, die jede geteilte Zeichenfolge enthalten, das heißt, ** jede ** Zeichenfolge in searchString muss in den resultierenden Zeichenfolgen sein? – Breland

+0

Wenn die Frage von @Breland wahr ist, würde das ändern sich ändern. Enthält zu .All Ich möchte die von diesem Ausdruck erzeugte Abfrage sehen – jjchiw

+0

was sollte Ihre endgültige Ausgabe sein? – Yasser

Antwort

17

Ich denke Code unten sollte Ihr Problem lösen. Es überprüft, ob alle Wörter im Suchstring in einer Abfrage enthalten sind (a).

var suggestions = (from a in query 
        where searchstrings.All(word => a.ToLower().Contains(word.ToLower())) 
        select a); 
+0

Das hat super geklappt, danke! – Alexander

16
var query = new string[] 
{ 
    "abc foo bar xyz john doe", 
    "abc foo bar xyz doe", 
    "hello world", 
    "abc foo bar john doe", 
}; 

var searchstrings = new string[] 
{ 
    "abc", 
    "foo", 
    "john", 
    "xyz", 
}; 

searchstrings = searchstrings.Select(x => x.ToLower()).ToArray(); 

var results = query.Select(x => x.ToLower()) 
        .Where(x => searchstrings.All(y => x.Contains(y))); 

Hinweis:
ToLower() außerhalb der Where Klausel durchgeführt wird, eine Menge Anrufe an diese Methode zu speichern.

+3

+1 zum Refactoring des '.ToLower' Aufrufs ... –

Verwandte Themen