bitmap(位图)算法

bitmap算法是利用数据二进制的每一位的值来表示数据的算法,可用来压缩保存数据集。

如何保存

如 5(int)的二进制表示为 101b,第一位和第三位的值是1就可以表示数据集 {1,3} ,也就是1个int类型,最多可以保存包含 32个int(4字节32位)的数据集(即表示数字1-32的集合),如果用字符保存,char是2字节16位(纯数字用啥字符类型),都是极大节省了存储空间。

如何存储到数据库

一般数据库可以表示整型类型有int,long(bigint),decimal等,可按需选择,不够再做调整。


复选框存储

在实际生产中,我们经常会碰到包含复选框的表单开发,大部分都是直接使用一个字符串加上逗号等特殊符号分隔进行存储。如"1,3,5"这种形式存储,代码处理选中时再分隔成List去判断是否包含,相信很多人都这样做过。这样的好处是存储的数据会更直观,却不便于sql查询(暴力模糊查询)。

适用bitmap场景

枚举值较多,数据量较大(like匹配不走索引),复杂查询统计。

代码实现

枚举定义

枚举值为2的n次方,使用Flags特性,标识这个是标记枚举(用不用重载的方法不重要,重要的是规范,做为一个标识),会被用来进行(位)运算。

[Flags]
public enum DefaultMerchantType
{
/// <summary>
/// 一单一付
/// </summary>
[Description("一单一付")]
OneOrderOnePay = 1, /// <summary>
/// 非T+N
/// </summary>
[Description("非T+N")]
NoTN = 2, /// <summary>
/// T+N
/// </summary>
[Description("T+N")]
TN = 4,
}

页面渲染

通过位运算&判断是否选中,sql也是同理。

<td>
@{
var enumDtos = typeof(DefaultMerchantType).GetFields().Skip(1).Select(e => new
{
EnumValue = (int)e.GetValue(null),
EnumDesc = (e.GetCustomAttributes()
.Where(ac => ac.GetType() == typeof(System.ComponentModel.DescriptionAttribute)).FirstOrDefault()
as System.ComponentModel.DescriptionAttribute).Description,
}).ToList(); ;
}
@for (int i = 0; i < enumDtos.Count; i++)
{
<label>
@Html.CheckBox("DefaultAccountList[" + i + "]", (Model.DefaultAccount & enumDtos[i].EnumValue) == enumDtos[i].EnumValue)@enumDtos[i].EnumDesc;
</label>
}
</td>

表单项转int存储

后台接收到list,再转成Int存储,注意Reverse()将复选框的顺序值进行反转,如1010b,展示顺序是0,1,0,1。

public class BitMapHelper
{
//将复选框的List转成int存储
public static int CheckListToInt(List<bool> checks)
{
if (checks == null || !checks.Any())return 0;
return Convert.ToInt32(new string(checks.Select(r => r ? '1' : '0').Reverse().ToArray()),2);
}
}

复选框与bitmap算法实践的更多相关文章

  1. Spring MVC-表单(Form)标签-复选框集合(Checkboxes)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkboxes.htm 说明:示例基于Spring MVC 4.1.6. 以 ...

  2. Spring MVC-表单(Form)标签-复选框(Checkbox)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_checkbox.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...

  3. 复选框demo

    本篇文章是关于复选框的,有2种形式:1.全选.反选由2个按钮实现:2.全选.反选由一个按钮实现. <!DOCTYPE html> <html> <head> < ...

  4. js复选框全选反选

    本篇文章是关于复选框的,有2种形式:1.全选.反选由2个按钮实现:2.全选.反选由一个按钮实现. <!DOCTYPE html> <html> <head> < ...

  5. [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框

    本文主要介绍PyQt5界面最基本使用的单选按钮.复选框.下拉框三种控件的使用方法进行介绍. 1.RadioButton单选按钮/CheckBox复选框.需要知道如何判断单选按钮是否被选中. 2.Com ...

  6. Tkinter 之CheckButton复选框标签

    一.参数说明 语法 作用 Checkbutton(root,text='xxxx') 复选框显示的文本 Checkbutton(root,variable=id) 通过变量的值确定哪些复选框被选中 C ...

  7. (七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static

    1,模态对话框和非模态对话框 // 模态对话框 void CMainFrame::OnDialogExec() { // TODO: 在此添加命令处理程序代码 // 创建对话框对象 CDialog d ...

  8. 对jquery操作复选框

    摘要:jquery操作复选框.使用更简洁易懂,思路清晰,逻辑更明了,很实用 <!DOCTYPE html> <html> <head> <meta chars ...

  9. MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件

    类似于多层级的角色与权限控制功能,用MVC实现MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件.最近我们的项目中需要用到树型菜单,以前使用WebForm时,树型菜单有微软提供的 ...

随机推荐

  1. JQuery调用WebService封装方法

    //提交的webservice链接 //var url = "/wsstafffrate?OpenWebService"; //请求前拼接好的soap字符串 //var soapd ...

  2. idea中MavenWeb项目不能创建Servlet的解决办法

    问题 学习完maven后,用maven创建了一个web项目,然后在这个web项目中创建了一个java文件夹并标记这个目录为源码根目录,当我准备创建一个Servlet的时候发现没有,如下图 解决办法 1 ...

  3. TotalUninstall6破解步骤卸载软件更彻底更专业

    软件包分享,这里使用的是6.24版本 链接:https://pan.baidu.com/s/1aVd6bclk5A6puyWBfAOA2A提取码:mhl9 接下来开始安装 安装步骤: 点击安装.基本上 ...

  4. gulp常用插件之gulp-eslint使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 ** gulp-eslint**这是一个用于识别和报告在ECMAScript/JavaScript代码中找到的模式的Gulp插件.. 更多使用文档 ...

  5. STL-set&&multiset 集合

    #include <iostream> #include <cstdio> #include <set> // 仿函数的原型 //struct greaters / ...

  6. 关于xshell和文件传输相关

    Xshell连接linux系统 下载Xshell后启动软件 不能连接,没有弹出输入账户和密码时在linux中执行 然后再次执行Xshell 连接成功 文件传输 点击Xshell的文件传输 会引导你去安 ...

  7. 咸鱼的ACM之路:动态规划(DP)学习记录

    按挑战程序设计竞赛介绍的顺序记录一遍学习DP的过程. 1. 01背包问题 问题如下: 有N个物品,每个物品(N[i])都有一定的体积(W[i]),和一定的价值(V[i]) 现在给定一个背包,背包的容量 ...

  8. tsocks代理git wget

    使用clash时, 命令行的wget和git操作可能没有被代理 安装tsocks: apt-get install tsocks 修改配置文件: vi /etc/tsocks.conf 找到: ser ...

  9. React Hooks 笔记1

    useState const [state, setSate] = useState(initialState) 特征: setState 标识稳定,组件重新渲染时不会变化,useState 返回的第 ...

  10. script标签引入脚本的引入位置与效果

    用script标签引入脚本的引入位置大致有两种情况: 1,在head中引入: 2,在body末尾引入: 浏览器由上到下解析代码,正常情况下,先解析head中的代码,在解析body中的代码:放在head ...