获取从列表中的项目,其中内部列表包含设置枚举值的

问题描述:

我有一个包含枚举值的列表类:获取从列表中的项目,其中内部列表包含设置枚举值的

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

现在我有一个包含我想要的MyClass元素的列表过滤器的基础在他们的枚举值列表上。

Category标有Flags使二元组合:

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

MyClass该列表可以包括枚举值的任意数量的可能或可能不被binarily组合的:

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

现在检索myList中包含给定Category的所有元素我使用这个:

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

现在问题出现时cat由多个枚举值组成。例如。当cat等于Category.Geometry | Category.Base_Geometry我想选择所有具有Geometry,Base_Geometry或甚至两者都在ListProperty中的元素。在这种情况下,result为空。

这种情况

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

要求y包含cat内的所有标志。如果您需要y包含内cat任何标志的,比较&零结果:

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

注:考虑标记您的Category枚举与[Flags]属性,并使用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