使用LINQ,其中项列表包含组件列表中的任何组件

使用LINQ,我如何找到一个项目列表,其中组件列表包含来自另一个组件列表的组件?

结构体:

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

例:

 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" } } } 

输出将返回IT1和IT3项。

我尝试了以下方法:

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

我收到以下错误:

无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

它应该是相反的方式:首先是Any ,然后是Contains 。 您希望获得components列表中包含 任何组件的所有项目。

如果您想获取Item列表,也不要使用Select

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

因为Any需要布尔值,但是返回string: x.Name.ToString

在你的情况下你可以检查两个序列的交集:

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

如果item.Componentscomponents包含相同的元素,则Intersect将返回非空序列。 如果序列非空,则Any不带参数的都将返回true