在日常的开发工作当中,位枚举可能会被经常使用,如星期多选、租期多选等等,我们可以将多选字段做或运算,然后保存到数据库表的字段中,如 1 | 2 = 3(0001 | 0010 = 0011 = 3)。

一、定义位枚举(Flags)

只需要在枚举上添加FlagsAttribute特性

[Flags]
public enum C
{
[Description("a")]
a = 1 << 0,
[Description("b")]
b = 1 << 1,
[Description("c")]
c = 1 << 2,
[Description("所有")]
d = -1
}

注意事项:定义位枚举时,一定要保证值的二进制之间值做&运算为0,如 2的n次方。
为什么使用-1代表所有:1的二进制就是1的补码,相当于在n位中的二进制就是n个1组成。

2、位枚举的方法

在Nuget引入包Enums.Net或者在程序包管理控制台中输入Install-Package Enums.NET -Version 4.0.0。

常用方法:

1、HasFlag


//与HasAllFlags一样的
var c = C.a | C.b;
var h = C.c | C.a;
// var result = source.HasFlas(Targe)
// 如果source | Targe = Source 或者 Source & Targe = Targe
//则为true 否则为False,可以理解成Targe是Source的真子集
var b = c.HasFlag(c); // true
var d = c.HasFlag(C.a); // true
var e = c.HasFlag(C.c); // false
var f = c.HasFlas(h); // false

2、HasAnyFlags


var c = C.a | C.b;
var h = C.d | C.a; // var result = source.HasFlas(Targe)
// source & targe != 0 则为true 否则为false
// 可以理解成source与targe不存在交集
//在开发当中,需要判断两条数据中字段是否存在冲突时 var e = c.HasAnyFlags(h); // true
var f = C.d.HasAnyFlags(c); // true;

3、FlagEnums.CombineFlags


var s = new List<C> { C.a, C.b, C.c}; // s中的元素做或(|)运算
var h = FlagEnums.CombineFlags(s);
var b = (int)h == 7; // true

4、FlagEnums.GetAllFlags
获取枚举中的全部枚举值,除-1外

   var h = FlagEnums.GetAllFlags<C>(); // a | b | c

5、GetFlags

    var h = FlagEnums.GetAllFlags<C>();
var h1 = h.GetFlags().ToList(); // 拆分 a | b | c

6、AsString(EnumFormat.Description)

    // 获取描述
var h = C.d.AsString(EnumFormat.Description); // 所有
 
 
 

C#中位枚举(Flags)的更多相关文章

  1. 在C#中对枚举进行位运算--枚举组合

    由于枚举的基础类型类型为基本的数值类型,支持位运算,因此可以使用一个值表示多个枚举的组合,在定义枚举时需要指定枚举数为2的幂指数方便进行位运算,即枚举数为1,2,4,8…,或1,1<<1, ...

  2. .NET中的枚举(Enum)

    摘要:.NET中的枚举分为简单枚举和标志枚举,这次主要总结一下标志枚举适用条件,以及它的使用方法,并在文章的最后列举枚举使用的一些规范. 在刚接触.NET的枚举时,只用简单的枚举,对于标记枚举,只知道 ...

  3. C#中的枚举(Enum)你知道多少呢?

    写个随笔文章是最难想的,我要是写个C#枚举个人小结,估计博客园的各位园有也觉得是哪个刚接触C#的人写的,要是取个名字叫C#枚举,又觉得不能完全表达自己的意思,现在这个名字看起来还凑合吧,写篇文章不容易 ...

  4. 你必须知道的.Net 8.4.4 位枚举

    位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值:枚举 类型则通常表达一种语义相对独立的数值集合.而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举.在.NET ...

  5. 项目中Enum枚举的使用

    在.NET中,枚举一般有两种常见用法,一是表示唯一的元素序列,比如表示订单状态(未提交,待处理,处理中...).另外一种是表示多种组合的状态,比如表示权限,因为可同时有多个不同权限. 基本用法 这里拿 ...

  6. OC中的枚举类型

    背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...

  7. 用好Java中的枚举真的没有那么简单

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  8. Python中的枚举类enum

    0. 本文来历 上一篇文章,我写了Pytest插件pytest-order指定用例顺序 我当时就比较好奇它的顺序和英文的对应关系,肯定是写死的,找了下就发现在源码sorter.py中定义了一个dict ...

  9. Python 中的枚举类型~转

    Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...

  10. JavaScript中的枚举

    在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留). 然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式- ...

随机推荐

  1. Causal Inference理论学习篇-Tree Based-Causal Tree

    Tree-Based Algorithms Tree-based这类方法,和之前meta-learning 类的方法最明显的区别是: 这类方法把causal effect 的计算显示的加入了到了树模型 ...

  2. 详解K8s 镜像缓存管理kube-fledged

    本文分享自华为云社区<K8s 镜像缓存管理 kube-fledged 认知>,作者: 山河已无恙. 我们知道 k8s 上的容器调度需要在调度的节点行拉取当前容器的镜像,在一些特殊场景中, ...

  3. wireshark 抓包整理———— 从一个小案例开始 [一]

    前言 前面已经有抓包系列了,简单写一下wireshark的抓包系列,共36节,18个理论小栗子,36个实战栗子. 正文 这个例子是<<wireshark 分析就这么简单>>的一 ...

  4. Spark3.0 Standalone模式部署

    之前介绍过Spark 1.6版本的部署,现在最新版本的spark为3.0.1并且已经完全兼容hadoop 3.x,同样仍然支持RDD与DataFrame两套API,这篇文章就主要介绍一下基于Hadoo ...

  5. 【笔记】go语言--结构体,方法,包与封装

    [笔记]go语言--结构体,方法,包与封装 结构体和方法 面向对象 go语言仅支持封装,不支持继承和多态 go语言没有class,只有struct //结构的定义 type TreeNode stru ...

  6. 第五章:SQL高级处理

    第五章:SQL高级处理 5.1 窗口函数 5.1.1 窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数.OLAP 是 OnLine AnalyticalProcessing 的简称,意思是对数 ...

  7. 暑期集训 Day12 —— 模拟赛复盘

    ${\color{Green} \mathrm{Problem\ 1 :Subarray }} $ Map. ${\color{Green} \mathrm{Problem\ 2 :小z玩游戏 }} ...

  8. 我们为什么要做 SoloPi

    SoloPi现状 去年(2019年)7月份,蚂蚁集团正式对外开源了客户端自动化测试工具 SoloPi ,其主要包括三大模块:录制回放(用于功能测试).性能工具(用于性能测试)以及一机多控(服务于兼容性 ...

  9. 一文详解 Nacos 高可用特性

    简介: 我今天介绍的 Nacos 高可用,是 Nacos 为了提升系统稳定性而采取的一系列手段.Nacos 的高可用不仅仅存在于服务端,同时也存在于客户端,以及一些与可用性相关的功能特性中,这些点组装 ...

  10. CF-943(已更B-E)

    CF- 943(已更 B-E) D赛时没调出来(╬▔皿▔)╯,还有几分钟的时候反而把E过了,本来应该是上大分一场(⊙﹏⊙),等会会补G1 这假期要刷题,还要补文化课--后面有空的话更一下之前打的线下赛 ...