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

时间:2017-05-29 08:17:01

标签: c# linq

使用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表达式转换为预期的委托类型,因为   块中的某些返回类型不可隐式转换   到委托的返回类型

2 个答案:

答案 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())
如果Intersectitem.Components包含相同的元素,

components将返回非空序列。如果序列非空,则不带参数的Any将返回true