如何检查一个字节值是否与指定的标志枚举中的任何标志相匹配
本文关键字:标志 枚举 任何 是否 检查 何检查 一个 字节 | 更新日期: 2023-09-27 18:03:56
在c#中,我将一个标志枚举值作为字节存储在数据库中。例如,对于以下标志enum:
[Flags]
public enum Options
{
None = 0,
First = 1,
Second = 2,
Third = 4
}
如果我想记录'First'和'Second',我将其保存为数据库中记录的'options'字段中的'3'字节。
因此,当使用LINQ时,我如何检查数据库中的值是否与作为' options '枚举传递的参数中的'任何'选项相匹配,类似于以下伪代码:
public static Something(Options optionsToMatch)
{
db.MyEntity.Get(a => a.options contains any of the options in optionsToMatch);
下面的代码通过迭代枚举来实现您想要的功能(我从这里得到了答案)。
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();
首先,定义有用的标志。每个标志有一个单独的设置位,因此它们可以很容易地组合成任何组合。
[Flags]
enum opts : byte {
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
//.. etc
}
然后按位与运算看看它是否不等于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
}