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

Get items from list where inner list contains set of enum-values

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

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 时,我想 select 所有在 ListProperty 中具有 GeometryBase_Geometry 甚至两者的元素。在这种情况下 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));

注意:考虑使用 [Flags] 属性标记您的 Category 枚举,并使用 Enum.HasFlag method to check an overlap (Q&A with the explanation):

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