从列表中获取项目,其中内部列表包含一组枚举值
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
中具有 Geometry
、Base_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));
我有一个 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
中具有 Geometry
、Base_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));