1

我得到了这些对象

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
}

有没有更简洁的方法可以在没有硬编码“类型异常”的情况下做到这一点?

4

2 回答 2

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

这个链接也很不错: http: //geekswithblogs.net/BlackRabbitCoder/archive/2010/07/22/c-fundamentals-combining-enum-values-with-bit-flags.aspx

于 2013-10-08T15:40:18.347 回答
0

虽然Bassam 的回答提供了一些关于如何解决问题的很好的一般信息,但它并没有将问题与现实解决方案之间的点点滴滴联系起来。

[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
于 2021-06-19T10:20:20.617 回答