2010-08-15 2 views
1

Je suis nouveau à LINQ et cela fait maintenant des heures que je suis là. J'ai une liste <> d'objets où l'une des propriétés des objets est une liste des catégories sélectionnées. J'ai aussi, en dehors des objets, une liste représentant un sous-ensemble de catégories et je veux retourner tous les objets qui contiennent au moins une catégorie qui est aussi dans le sous-ensemble comme illustré dans le pseudo code suivant (pas mon vrai code). Dans l'exemple ci-dessus, j'ai besoin de retourner alphie et bob car ils ont tous deux au moins une catégorie qui est dans mon sous-ensemble.Quel est l'équivalent d'une clause SQL "in" ici?

La seule solution à ce jour est d'obtenir une liste des deux, puis d'utiliser des boucles foreach coûteuses pour passer et comparer. Je suis sûr que LINQ doit fournir un moyen plus efficace d'atteindre la même chose?

Plus de détails (je pense que mon code pseudo est pas assez détaillé)

public class RadioProgram { 
    ... 
    private List<string> _category = new List<string>(); 
    public List<string> Category { get { return _category; } set { _category = value; }   } 
    ... 
} 

public class Category { 
    ... 
    private string _categoryName = ""; 
    private List<Category> _subCategories = new List<Category>(); 
    public string CategoryName { get { return _categoryName; } set { _categoryName = value; } } 
    public List<Category> SubCategories { get { return _subCategories; } set { _subCategories = value; } } 
    ... 
} 

J'ai une méthode, GetCategories (chaîne parentCategory), qui retourne tous les categoryNames enfants sous forme de liste. Chaque radioProgram.Category (oui, le nom doit être refactorisé au pluriel) est lui-même une liste et peut contenir zéro, un ou plusieurs categoryNames. Je reçois ma liste principale de radioPrograms et je veux retourner un sous-ensemble qui contient où chacun contient au moins un nom de catégorie qui correspond à l'ensemble de GetCategories. J'essaie d'éviter de changer l'architecture de l'application (ce qui est une solution potentielle) car cela signifie beaucoup de refactorisation des fonctionnalités existantes ET je pense que cela se révèle être un bon exercice pour aborder et comprendre LINQ.

Répondre

3

Une chose que vous pouvez utiliser est

myclasses 
    .Where(o => o.category.Any(c => subset.Contains(c))); 
+0

Merci, je suis venu à travers des solutions similaires, mais je pense qu'ils n'ont pas travaillé et je pense qu'il est parce que je dois rejoindre en quelque sorte les deux listes en premier. J'ai développé mon post original avec plus de détails. – tforster