ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

复选框与bitmap算法实践

2020-01-22 15:01:24  阅读:269  来源: 互联网

标签:存储 int 复选框 算法 bitmap enums checks


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查询(暴力模糊查询)。

适用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,
}

页面渲染

通过位运算&判断是否选中

<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。

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;
    }
}

参考资料:

《漫画算法》

标签:存储,int,复选框,算法,bitmap,enums,checks
来源: https://www.cnblogs.com/zk-ljc/p/12205634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有