private g_game_ball_result DynmicAssignment(g_game_ball_result entity, List <int> source, int count) { Type type = typeof(g_game_ball_result); //取得属性集合 PropertyInfo[] pi = type.GetProperties(); foreach (PropertyInfo item in pi) { if (item.Name.Contains("b_")) { int result = 0; bool isInt = int.TryParse(item.Name.Split('_')[1], out result); if (isInt && result <= count) { item.SetValue(entity, Convert.ChangeType(source[result - 1], item.PropertyType), null); } } } return(entity); }
/// <summary> /// 此种统计方式为统计 开奖号码个数 * 总号码个数列 的彩种 /// </summary> /// <param name="gameTypeId">彩种ID</param> /// <param name="summaryCount">统计期数(30,50,80)</param> public void Analysis1(int gameTypeId, int summaryCount) { using (var conn = (new DapperDb()).DbConnection) { var analysis = new LotteryResultAnalysisRepository(conn, null); List <g_game_type_result> results = analysis.GetLotteryResult(gameTypeId, summaryCount).OrderBy(p => p.open_reward_time_ts).ToList(); if (results != null && results.Count > 0) { #region string expect_no = results.OrderByDescending(p => p.expect_no).FirstOrDefault().expect_no; //获取最近一期的编号,如果不存在才开始统计 bool isExist = analysis.CheckAnalysisIsExist(summaryCount, gameTypeId, expect_no); if (isExist) { return; } List <string> strRewardNos = results.Select(p => p.win_reward_no).ToList(); //初始化 summary_count 期 ball_count 个开奖号码个数的开奖号码集合 List <List <int> > rewardNos = new List <List <int> >(); for (int i = 0; i < strRewardNos.Count; i++) { List <int> rewardNo = new List <int>(); string[] strRewardNo = strRewardNos[i].Split(','); for (int j = 0; j < strRewardNo.Length; j++) { rewardNo.Add(Convert.ToInt32(strRewardNo[j]) - left_offset); } rewardNos.Add(rewardNo); } //声明一个统计用的2维泛型集合并初始化值为-1 List <List <int> > summary = new List <List <int> >(); for (int i = 0; i < summaryCount; i++) { List <int> prize_number = new List <int>(); //生成 中奖号码个数*总号码个数列 for (int j = 0; j < total_balls_count * prize_balls_count; j++) { prize_number.Add(-1); } summary.Add(prize_number); } try { //把每一期的中奖号码赋值到统计集合中 for (int i = 0; i < summary.Count; i++) { //有多少中奖号码即循环几次赋值 for (int k = 0; k < prize_balls_count; k++) { //Console.Write("中奖值为:" + inits[i][k]); //inits[i][k] 的值为具体第i期的第k个中奖号码值。 //inits[0][0] 即为 第1期第1个中奖号码,i为第几期,k为第几个号码 int prize_number = rewardNos[i][k]; //total_balls_count * k 为第k个中奖号的偏移量,因为每个中奖号码都需要占用所有号码的下标位置 int offset = total_balls_count * k; //总偏移量为每一个中奖号码的偏移量加上本上的值。比如:假设总共10个号码 //第一个中奖号的偏移量为0*10,中奖号为7.即0+7=7; //第二个中奖号的偏移量为1*10,中奖号为8,即10+8=18; int total_offset = offset + prize_number; //把每一个中奖号赋值到统计集合中 summary[i][total_offset] = prize_number; } } } catch (Exception ex) { LogHelper.WriteLog(typeof(Exception), "LotteryAnalysisService-> \r\n" + ex.StackTrace + "\r\n " + ex.Message + "\r\n " + ex.InnerException); } List <int> totals = new List <int>(); List <int> continuous = new List <int>(); List <int> max = new List <int>(); List <int> avg = new List <int>(); //按总列数循环总行数次,比较每一列的值 for (int i = 0; i < total_balls_count * prize_balls_count; i++) { //出现总次数 int total_count = 0; //最大遗漏值 int max_miss_count = 0; //最大连出值 int max_continuous_count = 0; //当前遗漏值 int current_miss_count = 0; //当前连出值 int current_continuous_count = 0; int last_row = 0; for (int j = 0; j < summary.Count; j++) { int current_value = summary[j][i]; if (current_value != -1) { //最后出现中奖号行数 last_row = j + 1; //更新出现总次数 total_count++; //更新当前连出值 current_continuous_count++; //更新最大遗漏值 if (current_miss_count > max_miss_count) { max_miss_count = current_miss_count; } current_miss_count = 0; } else { //为默认值即为不是中奖号遗漏值 //更新当前 current_miss_count++; //更新最大连出值 if (current_continuous_count > max_continuous_count) { max_continuous_count = current_continuous_count; } current_continuous_count = 0; } } totals.Add(total_count); continuous.Add(max_continuous_count); max.Add(max_miss_count); avg.Add(total_count != 0 ? (last_row - total_count) / total_count : 0); } List <g_game_ball_result> summaryDatas = new List <g_game_ball_result>(); for (int i = 0; i < prize_balls_count; i++) { List <int> _totals = totals.Skip(i * total_balls_count).Take(total_balls_count).ToList(); List <int> _continuous = continuous.Skip(i * total_balls_count).Take(total_balls_count).ToList(); List <int> _max = max.Skip(i * total_balls_count).Take(total_balls_count).ToList(); List <int> _avg = avg.Skip(i * total_balls_count).Take(total_balls_count).ToList(); g_game_ball_result total_data = new g_game_ball_result(); g_game_ball_result continue_data = new g_game_ball_result(); g_game_ball_result max_data = new g_game_ball_result(); g_game_ball_result avg_data = new g_game_ball_result(); total_data.game_type_id = gameTypeId; total_data.expect_no = expect_no; total_data.b_no = i + 1; total_data.category = 1; avg_data.game_type_id = gameTypeId; avg_data.expect_no = expect_no; avg_data.b_no = i + 1; avg_data.category = 2; max_data.game_type_id = gameTypeId; max_data.expect_no = expect_no; max_data.b_no = i + 1; max_data.category = 3; continue_data.game_type_id = gameTypeId; continue_data.expect_no = expect_no; continue_data.b_no = i + 1; continue_data.category = 4; DynmicAssignment(total_data, _totals, total_balls_count); DynmicAssignment(continue_data, _continuous, total_balls_count); DynmicAssignment(max_data, _max, total_balls_count); DynmicAssignment(avg_data, _avg, total_balls_count); summaryDatas.Add(total_data); summaryDatas.Add(avg_data); summaryDatas.Add(max_data); summaryDatas.Add(continue_data); } if (summaryDatas.Count > 0) { analysis.Insert(summaryCount, summaryDatas); } #endregion } } }