我有一个包含枚举值列表的类:
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_Geometry
,ListProperty
甚至两者都有的所有元素。在这种情况下,result
为空。
答案 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));