C# - 如何检查字节值是否与指定标志枚举中的任何标志匹配?

时间:2016-08-25 01:05:28

标签: c# enums flags

在C#中,我将一个标志枚举值作为字节存储在数据库中。例如,对于以下Flags枚举:

[Flags]
public enum Options
{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4
}

如果我想录制'First'和'Second',我会将其保存为数据库中记录的'options'字段中的'3'字节。

因此,在使用LINQ时,如何检查数据库中的值是否与作为“选项”枚举传递的参数中的“任何”选项匹配,类似于此伪代码:

    public static Something(Options optionsToMatch)
    {
       db.MyEntity.Get(a => a.options contains any of the options in optionsToMatch);

2 个答案:

答案 0 :(得分:1)

这里的代码通过迭代枚举来完成您想要的操作(我从here获得了答案。)

   static void Main()
    {
        //stand-in for my database
        var options = new byte[] { 1, 2, 3, 3, 2, 2, 3, 4, 2, 2, 1,5 };

        var input = (Options)5;

        //input broken down into a list of individual flags
        var optional = GetFlags(input).ToList();
        //get just the options that match either of the flags (but not the combo flags, see below)
        var foundOptions = options.Where(x => optional.Contains((Options)x)).ToList();
        //foundOptions will have 3 options: 1,4,1
    }

    static IEnumerable<Enum> GetFlags(Enum input)
    {
        foreach (Enum value in Enum.GetValues(input.GetType()))
            if (input.HasFlag(value))
                yield return value;
    }

修改

如果您还想在此示例中找到5(选项组合),只需添加一个额外的或条件如下:

var foundOptions = options.Where(x => optional.Contains((Options)x) || input == (Options)x).ToList();

答案 1 :(得分:0)

首先,有用地定义标志。每个标志的一个设置位,以便它们可以轻松地以任意组合组合。

[Flags]
enum opts : byte {
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    //.. etc
}

然后只是按位AND并查看它是否不等于0

opts a = opts.A | opts.D;
opts b = opts.B | opts.C | opts.D;
var c = a & b; //D

if((byte)c!=0){
    // ... things
}