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
《漫畫算法》開發