2017-08-09 10 views
1

私は、列挙値のリストを含むクラスを持っている:を設定取得

class MyClass 
{ 
    List<Category> ListProperty = ... 
} 

は今、私はベースをフィルタリングするMyClassの要素を含むリストを持っていますその列挙値リストに追加します。

Categoryは、バイナリの組み合わせを可能にするためにFlagsでマークされている:

var m = new Myclass { 
    ListProperty = new List<Category> { 
     Category.Some_Category | Category.Another_Category, 
     Category.Basic 
    } 
}); 
myList.Add(m); 
MyClass

enum Category 
{ 
    None = 0x00, 
    Basic = 0x1, 
    Geometry = 0x2, 
    // ... 
    Base_Geometry = 0x100 
} 

リストはまたは二値組み合わされない場合があります列挙値の任意の数からなっていてもよいです

myListの中にある指定されたCategoryを含むすべての要素を取得するには、私はこれを使用します:

var cat = Category.Geometry; 
var result = myList.Where(x => x.ListProperty.Any(y => (y & cat) == cat)); 

catが複数の列挙値で構成されているときに問題が発生するようになりました。例えば。 catCategory.Geometry | Category.Base_Geometryに等しい場合、ListPropertyGeometryBase_Geometry、またはその両方のいずれかを持つすべての要素を選択したいとします。この場合、resultは空です。

答えて

0

この条件

var result = myList.Where(x => x.ListProperty.Any(y => (y & cat) == cat)); 

ycat内のすべてのフラグが含まれていることが必要です。

var result = myList.Where(x => x.ListProperty.Any(y => (y & cat) != 0)); 

注:あなたがcat内のフラグのいずれかを含むようにyが必要な場合は、&ゼロの結果を比較する[Flags]属性を使用してCategory列挙型をマーキングし、重複をチェックするEnum.HasFlag方法を使用することを検討してくださいQ&A with the explanation):

// Requires .NET 4 or later 
var result = myList.Where(x => x.ListProperty.Any(y => y.HasFlag(cat)); 
+0

実際には、Flagsでマークしました。しかし、 'HasFlags'は.NET4でのみ定義されています。私は使用できません。 – HimBromBeere

+0

@HimBromBeere私は - あなたが.NETの以前のバージョンを使用していることを認識していませんでした。 – dasblinkenlight

+0

質問に適切なタグを追加しました。 – HimBromBeere

関連する問題