wake-up-neo.com

Verwendung von Linq, um zu überprüfen, ob eine Liste von Zeichenfolgen Zeichenfolgen in einer Liste enthält

Ich konstruiere eine linq-Abfrage, die überprüft, ob eine Zeichenfolge in der Datenbank eine der Zeichenfolgen in einer Liste von Zeichenfolgen enthält. 

So etwas wie.

query = query.Where(x => x.tags
                   .Contains(--any of the items in my list of strings--));

Ich möchte auch wissen, wie viele Elemente in der Liste gefunden wurden.

Jede Hilfe wäre dankbar.

Update: Ich hätte erwähnen sollen, dass Tags eine Zeichenfolge und keine Liste sind. Ich füge noch ein paar weitere hinzu, die sich nicht auf Tags beziehen, bevor die Abfrage ausgeführt wird. Dies läuft gegen das Entity-Framework. 

11
Lrayh

BEARBEITEN: Diese Antwort nahm an, dass tags eine Sammlung von Strings war ...

Es klingt wie Sie möchten:

var list = new List<string> { ... };
var query = query.Where(x => x.tags.Any(tag => list.Contains(tag));

Oder:

var list = new List<string> { ... };
var query = query.Where(x => x.tags.Intersect(list).Any());

(Wenn dies LINQ to SQL oder EF verwendet, stellen Sie möglicherweise fest, dass eines funktioniert, das andere jedoch nicht. In LINQ to Objects sollten beide funktionieren.)

Um die Zählung zu erhalten, benötigen Sie Folgendes:

var result = query.Select(x => new { x, count = x.tags.Count(tag => list.Contains(tag)) })
                  .Where(pair => pair.count != 0);

Dann ist jedes Element von result ein Paar von x (das Element) und count (die Anzahl der übereinstimmenden Tags).

14
Jon Skeet

Ich habe so etwas schon einmal gemacht:

var myList = new List<string>();
myList.Add("One");
myList.Add("Two");

var matches = query.Where(x => myList.Any(y => x.tags.Contains(y)));
2
aleonj

so was:

List<string> list = new List<string>();
list.Add("One");
list.Add("Two");

 var result = query.Where(x => list.Contains(x.tags));
2
Ehsan Sajjad

Ich bin mir Ihrer Frage nicht ganz sicher, ob x.tags eine Zeichenfolge oder Liste ist, ob es sich um eine Liste handelt. Jon Skeets Antwort ist richtig. Wenn ich Sie richtig verstehe, ist x.tags eine Zeichenfolge. Wenn ja, dann lautet die Lösung:

list.Any(x => x.tags.IndexOf(x) > -1)

um sie zu zählen

list.Count(x => x.tags.IndexOf(x) > -1)
0
happygilmore