使用LINQ,我如何找到一个项目列表,其中组件列表包含来自另一个组件列表的组件?
结构:
class Item
{
public List<Component> Components {get;set;}
}
class Component
{
public string Name {get;set;}
}
示例:
var components = new List<string> { "C1", "C2" , "C3" }
var items = new List<Item>
{
new Item("IT1")
{
Components = new List<Component> { "C1", "C4","C5" }
},
new Item("IT2")
{
Components = new List<Component> { "C6", "C7","C8" }
},
new Item("IT3")
{
Components = new List<Component> { "C2", "C0","C9" }
}
}
输出将返回IT1和IT3项。
我尝试了以下内容:
items
.Select(i => i.Components)
.Where(c => components.Contains(c.Any(x => x.Name.ToString()));
我收到以下错误:
无法将lambda表达式转换为预期的委托类型,因为 块中的某些返回类型不可隐式转换 到委托的返回类型
答案 0 :(得分:4)
应该是另一种方式:首先是Any
,然后是Contains
。您希望获得components
列表中包含 的所有项目。
如果您想获得Select
的列表,请不要使用Item
:
var result = items.Where(i => i.Components.Any(c => components.Contains(c.Name)));
答案 1 :(得分:3)
因为Any
需要布尔值,但是返回字符串:x.Name.ToString
。
你可以检查两个序列的交集:
items.Where(x => x.Components.Intersect(components).Any())
如果Intersect
和item.Components
包含相同的元素, components
将返回非空序列。如果序列非空,则不带参数的Any
将返回true
。