Utilisez LINQ où la liste d’éléments contient n’importe quel composant dans une liste de composants

À l’aide de LINQ, comment puis-je trouver une liste d’éléments où sa liste de composants contient un composant provenant d’une autre liste de composants?

Structure:

class Item { public List Components {get;set;} } class Component { public ssortingng Name {get;set;} } 

Exemple:

 var components = new List { "C1", "C2" , "C3" } var items = new List { new Item("IT1") { Components = new List { "C1", "C4","C5" } }, new Item("IT2") { Components = new List { "C6", "C7","C8" } }, new Item("IT3") { Components = new List { "C2", "C0","C9" } } } 

La sortie renvoie les éléments IT1 et IT3.

J’ai essayé ce qui suit:

 items .Select(i => i.Components) .Where(c => components.Contains(c.Any(x => x.Name.ToSsortingng())); 

Je reçois l’erreur suivante:

Impossible de convertir l’expression lambda en type délégué prévu, car certains des types de retour contenus dans le bloc ne sont pas convertibles implicitement en type de retour délégué.

Ce devrait être l’inverse: d’abord le Any , puis le Contains . Vous souhaitez obtenir tous les éléments dont l’ un des composants figure dans la liste des components .

N’utilisez pas non plus le Select si vous souhaitez obtenir une liste d’ Item :

 var result = items.Where(i => i.Components.Any(c => components.Contains(c.Name))); 

C’est parce que Any s’attend à une valeur booléenne, mais vous renvoyez la chaîne: x.Name.ToSsortingng .

Vous pouvez vérifier l’intersection de deux séquences dans votre cas:

 items.Where(x => x.Components.Intersect(components).Any()) 

Intersect renverra une séquence non vide, si item.Components et components contiennent les mêmes éléments. Alors Any parameters sans parameters renverront true si la séquence n’est pas vide.