我得到了这些物品
enum ObjType { One, X, Two, Y, Three, Z}
List<ObjType> typeList
我想做一个像“如果typeList不包含类似X,Y,Z这样的类型”的条件,因为我有:
List<ObjType> typeExceptions = { ObjType.X, ObjType.Y, ObjType.Z}
if ( !typeList.Intersect(typeExceptions).Any() )
{
//do something
}
如果没有硬编码的“类型例外”,有没有更简洁的方法呢?
答案 0 :(得分:3)
您可以使用[Flags]
,而不是对这些标志应用基本的按位运算!
[Flags]
enum Days2
{
None = 0x0,
Sunday = 0x1,
Monday = 0x2,
Tuesday = 0x4,
Wednesday = 0x8,
Thursday = 0x10,
Friday = 0x20,
Saturday = 0x40
}
注意:
- 这将对值应用按位运算。
和:
var meetingDays = Days2.Tuesday & Days2.Thursday;
或者:
meetingDays = Days2.Tuesday | Days2.Thursday;
卸下:
// Remove a flag using bitwise XOR. this will remove the tuesday from the week!
meetingDays = meetingDays ^ Days2.Tuesday;
不
meetingDays = meetingDays ~Days2.Tuesday;
你必须注意Flag枚举值必须是2powern 0,1,2,4等。
我已经改变了我从微软方面得到代码的例子: http://msdn.microsoft.com/de-de/library/vstudio/cc138362.aspx
答案 1 :(得分:0)
虽然 Bassam's answer 提供了一些关于如何解决问题的很好的一般信息,但它并没有将问题与现实解决方案之间的点联系起来。
这是一个实现,它使用他使用 [Flags]
枚举指定的位操作、常量(用于保存要与之相交的值)和扩展方法来演示相交操作。
[Flags]
public enum ObjType
{
One = 0x01,
X = 0x02,
Two = 0x04,
Y = 0x08,
Three = 0x10,
Z = 0x20
}
public static class ObjTypeExtensions
{
public static readonly ObjType Exceptions = ObjType.X | ObjType.Y | ObjType.Z;
public static ObjType IntersectWith(this ObjType objType, ObjType value)
{
return objType & value;
}
public static bool Any(this ObjType objType, ObjType value)
{
return (objType & value) != 0;
}
}
var test1 = ObjType.One | ObjType.Three | ObjType.X;
var result1 = test1.IntersectWith(ObjTypeExtensions.Exceptions);
// result1 == ObjType.X
var test2 = ObjType.Two | ObjType.Y | ObjType.Z;
var result2 = test2.IntersectWith(ObjTypeExtensions.Exceptions);
// result2 == ObjType.Y | ObjType.Z
要测试是否存在任何相交值,只需调用 Any() 方法即可获得答案。
bool any2 = test2.Any(ObjTypeExtensions.Exceptions);
// any2 == true
var test3 = ObjType.One | ObjType.Three;
bool any3 = test3.Any(ObjTypeExtensions.Exceptions);
// any3 == false