web-dev-qa-db-fra.com

Comment utiliser Linq pour vérifier si une liste de chaînes contient une chaîne dans une liste

Je construis une requête linq qui va vérifier si une chaîne dans la base de données contient l'une des chaînes dans une liste de chaînes. 

Quelque chose comme.

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

J'aimerais également savoir combien d'éléments de la liste ont été appariés.

Toute aide serait appréciée.

Mise à jour: J'aurais dû mentionner que les balises sont une chaîne et non une liste. Et j'ajoute quelques éléments supplémentaires qui ne sont pas liés aux balises avant que la requête ne soit exécutée. Cela fonctionne contre le cadre de l'entité. 

11
Lrayh

EDIT: Cette réponse supposait que tags était une collection de chaînes ...

On dirait que vous voudrez peut-être:

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

Ou:

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

(Si cela utilise LINQ to SQL ou EF, vous pouvez en trouver une qui fonctionne mais pas l’autre. Dans LINQ to Objects, les deux devraient fonctionner.)

Pour obtenir le décompte, vous avez besoin de quelque chose comme:

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

Alors chaque élément de result est une paire de x (l'élément) et count (le nombre de balises correspondantes).

14
Jon Skeet

J'ai déjà fait quelque chose comme ça avant:

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

comme ça:

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

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

Je ne suis pas tout à fait sûr de votre question si x.tags est une chaîne ou une liste, s’il s’agit d’une liste Si je vous comprends bien, x.tags est une chaîne de chaînes. Si oui, la solution est la suivante:

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

les compter faire

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