filtrage d'une liste à l'aide de LINQ
j'ai une liste d'objets du projet:
IEnumerable<Project> projects
un Projet classe comme une propriété appelée Tags. c'est un int[]
j'ai une variable appelée filteredTags qui est aussi un int[].
Donc permet de dire que mon filtré tags variable ressemble à ceci:
int[] filteredTags = new int[]{1, 3};
Je veux filtrer ma liste (projets) à retourner uniquement les projets qui ont TOUTES les étiquettes figurant dans le filtre (dans ce cas au moins tag 1 tag ET 3 dans la Tags propriété).
J'ai essayé d'utiliser Où() et Contient (), mais qui ne paraît travail si je suis le comparant à une valeur unique. Comment faire pour comparer une liste contre une autre liste où j'ai besoin d'un match sur tous les éléments dans la liste filtrée ??
Vous devez vous connecter pour publier un commentaire.
EDIT: mieux encore, de le faire comme ça:
EDIT2: Honnêtement, je ne sais pas lequel est le mieux, donc, si la performance n'est pas critique, choisissez celui que vous pensez est plus lisible. Si elle l'est, vous aurez à l'indice de référence en quelque sorte.
Probablement
Intersect
est le chemin à parcourir:Bien que cela semble un peu moche au premier abord. Vous peut d'abord appliquer
Distinct
àfilteredTags
si vous n'êtes pas sûr de savoir si ils sont tous uniques dans la liste, sinon le compte de comparaison ne fonctionne pas comme prévu.Intersect
façon plus claire que votre "mieux encore" la méthodeCount()
parce qu'il a à évaluer les balisesIEnumerable
, mais je suis perplexe moi-mêmeNous devrions avoir les projets qui incluent les (au moins) tous les filtrée balises, ou dit d'une autre façon, d'exclure ceux qui ne comprennent pas tous ces filtré balises.
Nous pouvons donc utiliser Linq
Except
pour obtenir ces balises qui ne sont pas inclus. Ensuite, nous pouvons utiliserCount() == 0
avoir seulement ceux qui excluait pas de tags:Ou nous pouvons le rendre un peu plus rapide en remplaçant
Count() == 0
avec!Any()
:La bonne chose avec cette approche est que vous pouvez affiner les résultats de recherche de manière incrémentale.
Basé sur http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b,
EqualAll est l'approche qui répond le mieux à vos besoins.
Essayez ceci: