使用Linq从嵌套集合中选择对象

时间:2013-03-06 10:37:35

标签: c# linq

我有类似这样的类结构:

class MyClass
{
    public IEnumerable<AttributeGroup> AttributeGroups { get; set; }
}

class AttributeGroup
{
    public IEnumerable<Attribute> Attributes { get; set; }
}

class Attribute
{
    public string SomeProp { get; set; }
}

我需要获得具有特定“SomeProp”值的所有“属性”,无论它们属于哪个属性组。

例如,SomeProperty== 'A'MyClassObj.AttributeGroup[0]都可以找到MyClassObj.AttributeGroup[5],我需要编写一个Linq(或类似的东西)来从这两个不同的属性组中获取两个对象。

有什么建议吗?

3 个答案:

答案 0 :(得分:22)

首先从所有属性组中选择所有属性,然后仅选择具有属性的属性。

IEnumerable<Attribute> attributes =
    myClassInstance
        .AttributeGroups
        .SelectMany(x => x.Attributes)
        .Where(x => x.SomeProperty == 'A');

其他Linq风格的语法:

IEnumerable<Attribute> attributes =
    from attributeGroup in myClassInstance.AttributeGroups
    from attribute in attributeGroup.Attributes
    where attribute.SomeProperty == 'A'
    select attribute;

答案 1 :(得分:3)

查看SelectMany(http://msdn.microsoft.com/en-us/library/bb534336.aspx)。

例如:

myClassObjs.SelectMany(o => o.AttributeGroups.SelectMany(g => g.Attributes)).Where(a => a.SomeProp == "A")

此行选择SomeProp等于“A”的所有MyClass对象的所有AttributeGroup的所有Attribute对象。 a表示Where属于Attribute的lambda表达式。

答案 2 :(得分:0)

你的榜样不明确;我无法分辨你的意思,“来自这两个不同属性组的两个对象”。我猜你想要那些具有属性的组有问题:

from g in MyClassObj.AttributeGroups
where g.Any(attr => attr.SomeProperty == "A")
select g