如何使用LINQ和lambdas对列表中对象的位标志枚举属性执行按位OR?

时间:2011-05-09 23:53:05

标签: c# lambda enums bit-fields aggregate

我有一个对象集合,每个对象都有一个位字段枚举属性。我想要得到的是整个集合中位字段属性的逻辑OR。如何通过循环遍历集合(希望使用LINQ和lambda)来完成此操作?

这是我的意思的一个例子:

[Flags]
enum Attributes{ empty = 0, attrA = 1, attrB = 2, attrC = 4, attrD = 8}

class Foo {
    Attributes MyAttributes { get; set; }
}

class Baz {
    List<Foo> MyFoos { get; set; }

    Attributes getAttributesOfMyFoos() {
        return // What goes here? 
    }
}

我试图像这样使用.Aggregate

return MyFoos.Aggregate<Foo>((runningAttributes, nextAttributes) => 
    runningAttributes | nextAttribute);

但是这不起作用,我无法弄清楚如何使用它来获得我想要的东西。有没有办法使用LINQ和一个简单的lambda表达式来计算这个,或者我只是在集合上使用一个循环?

注意:是的,这个示例案例很简单,基本的foreach将成为可行的路线,因为它简单且不复杂,但这只是我实际使用的简化版本。 / p>

2 个答案:

答案 0 :(得分:19)

您的查询不起作用,因为您尝试在|上应用Foo,而不是Attributes。您需要做的是为集合中的每个MyAttributes获取Foo,这很明显Select()的作用:

MyFoos.Select(f => f.MyAttributes).Aggregate((x, y) => x | y)

答案 1 :(得分:2)

首先,您需要公开MyAttributes,否则您无法从Baz访问它。

然后,我认为您正在寻找的代码是:

return MyFoos.Aggregate((Attributes)0, (runningAttributes, nextFoo) => 
    runningAttributes | nextFoo.MyAttributes);