bitmap算法是利用数据二进制的每一位的值来表示数据的算法,可用来压缩保存数据集。算法
如 5(int)的二进制表示为 101b,第一位和第三位的值是1就能够表示数据集 {1,3} ,也就是1个int类型,最多能够保存包含 32个int(4字节32位)的数据集,再对比char是2字节32位(纯数字用啥字符类型),都是极大节省了存储空间。
通常数据库能够表示整型类型有int,long(bigint),decimal等,可按需选择,不够再作调整。
在实际生产中,咱们常常会碰到包含复选框的表单开发,大部分都是直接使用一个字符串加上逗号等特殊符号分隔进行存储。如"1,3,5"这种形式存储,代码处理选中时再分隔成List
枚举值较多,数据量较大(like匹配不走索引),复杂查询统计。数据库
枚举值为2的n次方,使用Flags特性,标识这个是标记枚举(用不用重载的方法不重要,重要的是规范,作为一个标识),会进行位运算。code
[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 enums = Enum.GetValues(typeof(DefaultMerchantType)) as IList<DefaultMerchantType>; } @for (int i = 0; i < enums.Count; i++) { <label> @Html.CheckBox("DefaultAccountList[" + i + "]", (Model.DefaultAccount & (int)enums[i]) == (int)enums[i])@BitMapHelper.GetEnumDescription(enums[i]); </label> } </td>
后台接收到list,再转成Int存储,注意Reverse()将复选框的顺序值进行反转,如1010b,展现顺序是0,1,0,1。ip
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); } public static string GetEnumDescription<TEnum>(TEnum e) { var fielInfo = e.GetType().GetField(e.ToString()); var objs = fielInfo.GetCustomAttributes(true); if (objs.Length <= 0) return string.Empty; var desAttr = objs[0] as DescriptionAttribute; if (desAttr != null) return desAttr.Description; return string.Empty; } }
参考资料:ci
《漫画算法》开发