2011-05-09 14 views
7

Nesnelerin bir koleksiyonuna sahibim ve her bir nesnenin bir bit alanı numaralandırma özelliği var. Ne elde etmeye çalıştığım, tüm koleksiyonun bit alanı özelliğinin mantıksal OR'idir. Bunu, koleksiyon üzerinde döngüsel olarak nasıl halledebilirim (umarım LINQ ve bunun yerine bir lambda kullanıyor)? Böyle .Aggregate kullanmayı denedikLINQ ve lambda'ları bir listedeki nesnelerin bit bayrak numaralandırma özelliğinde bit veya bit yerine getirmek için nasıl kullanabilirim?

[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? 
    } 
} 

: Burada

ne demek istediğimi bir örnek

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

ama bu işe yaramazsa ve ben anlamaya olamaz istediğimi elde etmek için kullanmak. Bunu hesaplamak için LINQ ve basit bir lambda ifadesini kullanmanın bir yolu var mı, yoksa sadece koleksiyon üzerinde bir döngü kullanarak mı kaldım?

Not: Evet, bu örnek durum, basit ve basit olduğundan basit bir foreach yolun gideceği kadar basittir, ancak bu aslında çalıştığım şeyin yalnızca aşağı indirilmiş halidir.

cevap

16

|Foo s adresinde Attributes ürününü değil, uyguladığınız için sorgunuz çalışmıyor. aksi takdirde Baz dan erişemez,

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

bu 2 sorguları gerektirirken, hala güzel, basit bir çözümdür, ve bana en yararlı olduğuna inanıyoruz: Sonra

, ben aradığınız kod olduğunu düşünüyorum en iyi cevap değil) çünkü aslında sonra olduğum şeyin ne olduğunu hatırlamama yardımcı oldu. – cdeszaq

2

İlk olarak, MyAttributes kamu yapmanız gerekir: Ne yapmak gerekir Select() yapar exaclty budur, koleksiyonunda her Foo için MyAttributes elde etmektir . olsa bile (

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

+1 parametrelerinin yanlış sırada olması için, ancak başlangıç ​​değeri için bir sihirli numara kullanmak için 11. (sadece 0 olduğu için bu şekilde kalacağı anlamına gelmez). – cdeszaq

+2

@cdeszaq: Soru açıkça, amacın tüm değerlerin bitsel OR'ını elde etmektir. Bunun için * her zaman * 0 ile başlamak istiyorum. Enum değerlerinden birini kullanmış olsaydım ('' durumda 'boş'), * değişebilir ve sonra kod yanlış olur. '0' sabitini kullanmak doğru yoldur. – Timwi

+0

Veya alternatif olarak, "varsayılan (Özellikler)". – svick

İlgili konular