9

我有一个类似这样的类结构:

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(或类似的东西)来从这两个不同的属性组中获取两个对象。

有什么建议吗?

4

3 回答 3

25

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

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;
于 2013-03-06T10:40:57.440 回答
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 对象的所有 AttributeGroups 的所有 Attribute 对象。Where 的 lambda 表达式中的 a 是 Attribute 类型。

于 2013-03-06T10:51:26.497 回答
0

你的例子不清楚;我不知道您所说的“来自这两个不同属性组的两个对象”是什么意思。我猜您想要具有相关属性的属性的组:

from g in MyClassObj.AttributeGroups
where g.Any(attr => attr.SomeProperty == "A")
select g
于 2013-03-06T10:42:29.263 回答