从列表中获取项目,其中内部列表包含一组枚举值

时间:2017-08-09 10:30:20

标签: c# linq enums .net-3.5

我有一个包含枚举值列表的类:

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

现在我有一个包含MyClass元素的列表,我希望根据它们的枚举值列表进行过滤。

Category标有Flags以启用二进制组合:

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

MyClass中的列表可能包含任意数量的枚举值,这些枚举值可能会或可能不会被二进制合并:

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_GeometryListProperty甚至两者都有的所有元素。在这种情况下,result为空。

1 个答案:

答案 0 :(得分:0)

这个条件

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):< / p>

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