获取从列表中的项目,其中内部列表包含设置枚举值的
问题描述:
我有一个包含枚举值的列表类:获取从列表中的项目,其中内部列表包含设置枚举值的
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));
我实际上用'Flags'标记了我的枚举。但'HasFlags'只在.NET4上定义,我不能使用它。 – HimBromBeere
@HimBromBeere我明白了 - 我没有意识到你是.NET的早期版本。 – dasblinkenlight
我在问题中添加了适当的标签。 – HimBromBeere