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
適用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 = https://www.cnblogs.com/zk-ljc/p/(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++)
{
表單項轉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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/103946.html
標籤:其他
