使用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.Components
和components
包含相同的元素,则Intersect
将返回非空序列。 如果序列非空,则Any
不带参数的都将返回true
。