複選框與bitmap算法實踐

bitmap(位圖)算法

bitmap算法是利用數據二進制的每一位的值來表示數據的算法,可用來壓縮保存數據集。算法

如何保存

如 5(int)的二進制表示爲 101b,第一位和第三位的值是1就能夠表示數據集 {1,3} ,也就是1個int類型,最多能夠保存包含 32個int(4字節32位)的數據集,再對比char是2字節32位(純數字用啥字符類型),都是極大節省了存儲空間。

如何存儲到數據庫

通常數據庫能夠表示整型類型有int,long(bigint),decimal等,可按需選擇,不夠再作調整。

複選框存儲

在實際生產中,咱們常常會碰到包含複選框的表單開發,大部分都是直接使用一個字符串加上逗號等特殊符號分隔進行存儲。如"1,3,5"這種形式存儲,代碼處理選中時再分隔成List 去判斷是否包含,相信不少人都這樣作過。這樣的好處是存儲的數據會更直觀,卻不便於sql查詢(暴力模糊查詢)。 sql

適用bitmap場景

枚舉值較多,數據量較大(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>

表單項轉int存儲

後臺接收到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

《漫畫算法》開發

相關文章
相關標籤/搜索