Как я могу использовать LINQ и лямбда-выражения для выполнения побитового ИЛИ для свойства перечисления битовых флагов объектов в списке? - PullRequest
8 голосов
/ 10 мая 2011

У меня есть коллекция объектов, и у каждого объекта есть свойство перечисления битовых полей.Я пытаюсь получить логическое ИЛИ свойства битового поля во всей коллекции.Как я могу сделать это, не зацикливаясь на коллекции (надеюсь, используя вместо этого LINQ и лямбду)?

Вот пример того, что я имею в виду:

[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 и простое лямбда-выражение для вычисления этого, или я застрял с использованием только цикла над коллекцией?

Примечание: Да, этот пример достаточно прост, что базовый foreach это будет путь, так как он прост и не сложен, но это всего лишь упрощенная версия того, с чем я на самом деле работаю.

Ответы [ 2 ]

19 голосов
/ 10 мая 2011

Ваш запрос не работает, потому что вы пытаетесь применить | к Foo с, а не к Attributes.Что вам нужно сделать, это получить MyAttributes за каждый Foo в коллекции.

2 голосов
/ 10 мая 2011

Во-первых, вам нужно сделать MyAttributes общедоступным, иначе вы не сможете получить к нему доступ с Baz.

Затем, я думаю, код, который вы ищете:

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