TrendDataHelpers.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using CB.Entity;
  6. namespace CB.Common
  7. {
  8. public class TrendDataHelpers
  9. {
  10. public static string RemergeTrendHtmlData(string HtmlData, int start, int end)
  11. {
  12. if (string.IsNullOrEmpty(HtmlData))
  13. return null;
  14. string _htmlData = HtmlData;
  15. if (_htmlData.Contains("<tr>"))
  16. _htmlData = _htmlData.Substring(4, _htmlData.Length - 9); //去除tr标签
  17. var constSplit = "</td>";
  18. var htmlArr = _htmlData.Split(new string[] { constSplit }, StringSplitOptions.RemoveEmptyEntries);
  19. if (end == 0 || end >= htmlArr.Length)
  20. end = htmlArr.Length - 1;
  21. var sb = new StringBuilder();
  22. for (var i = start; i <= end; i++)
  23. {
  24. sb.Append(htmlArr[i] + constSplit);
  25. }
  26. return sb.ToString();
  27. }
  28. private static string[] ExtensionEmptyCol(int emptyCount)
  29. {
  30. if (emptyCount <= 0)
  31. return new string[0];
  32. var arr = new string[emptyCount];
  33. for (var i = 0; i < emptyCount; i++)
  34. arr[i] = "-1";
  35. return arr;
  36. }
  37. public static IEnumerable<TrendDataStatItem> ExtensionEmptyColMissStatData(string missStatData,
  38. int frontColCount, int behindColCount)
  39. {
  40. //var extmissStatData = string.Join(",", ExtensionEmptyCol(frontColCount)) + "," +
  41. // missStatData + "," +
  42. // string.Join(",", ExtensionEmptyCol(behindColCount));
  43. foreach (var _s in ExtensionEmptyCol(frontColCount))
  44. {
  45. yield return new TrendDataStatItem { Value = _s };
  46. }
  47. foreach (var _s in missStatData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
  48. {
  49. if (_s == "-1") continue;
  50. yield return new TrendDataStatItem { Value = _s };
  51. }
  52. foreach (var _s in ExtensionEmptyCol(behindColCount))
  53. {
  54. yield return new TrendDataStatItem { Value = _s };
  55. }
  56. }
  57. public static IEnumerable<TrendDataStatItem> InsertEmptyColMissStatData(string missStatData, int startIndex,
  58. int colCount)
  59. {
  60. var _index = 0;
  61. foreach (var _s in missStatData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
  62. {
  63. if (_s == "-1") continue;
  64. if (_index == startIndex)
  65. foreach (var _s1 in ExtensionEmptyCol(colCount))
  66. yield return new TrendDataStatItem { Value = _s1 };
  67. yield return new TrendDataStatItem { Value = _s };
  68. _index++;
  69. }
  70. }
  71. public static IEnumerable<TrendDataStatItem> ExtensionEmptyColMissStatData(int[] missStatData,
  72. int frontColCount, int behindColCount)
  73. {
  74. foreach (var _s in ExtensionEmptyCol(frontColCount))
  75. {
  76. yield return new TrendDataStatItem { Value = _s };
  77. }
  78. foreach (var _i in missStatData)
  79. {
  80. //if (_i == -1) continue;
  81. yield return new TrendDataStatItem { Value = _i.ToString() };
  82. }
  83. foreach (var _s in ExtensionEmptyCol(behindColCount))
  84. {
  85. yield return new TrendDataStatItem { Value = _s };
  86. }
  87. }
  88. public static IEnumerable<TrendDataStatItem> InsertEmptyColMissStatData(int[] missStatData, int startIndex,
  89. int colCount)
  90. {
  91. var _index = 0;
  92. foreach (var _i in missStatData)
  93. {
  94. if (_index == startIndex)
  95. foreach (var _s1 in ExtensionEmptyCol(colCount))
  96. yield return new TrendDataStatItem { Value = _s1 };
  97. yield return new TrendDataStatItem { Value = _i.ToString() };
  98. _index++;
  99. }
  100. }
  101. public static void SetModelStaticData(object obj)
  102. {
  103. var model = obj as TrendDataEntity<TrendChartData, TrendChartData>;
  104. if (model == null) return;
  105. var trendDataList = (List<TrendChartData>)model.TrendDataItems;
  106. var lastTData = trendDataList.LastOrDefault();
  107. model.MaxMissList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllMaxMiss.LastOrDefault(), 1, 0);
  108. model.AvgMissList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllAvgMiss.LastOrDefault(), 1, 0);
  109. model.AppearsList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllTimes.LastOrDefault(), 1, 0);
  110. }
  111. public static Tuple<int[], int[], int[]> LocalMissData(IList<TrendChartData> list)
  112. {
  113. if (list == null || list.Count <= 0)
  114. return Tuple.Create<int[], int[], int[]>(new int[0], new int[0], new int[0]);
  115. //将list按期号升序排列
  116. list = list.OrderBy(info => info.Term).ToList();
  117. //本期遗漏列表(当前页数据根据本期遗漏计算)
  118. List<List<int>> LocalMissArray = new List<List<int>>();
  119. #region 将list里面提取本期遗漏数据
  120. foreach (var item in list)
  121. {
  122. var row = new List<int>();
  123. for (int i = 0; i < item.LocalMiss.Count(); i++)
  124. {
  125. if (item.LocalMiss[i] == "-1")
  126. {
  127. row.Add(-1);
  128. continue;
  129. }
  130. foreach (var missvalue in item.LocalMiss[i].Split(','))
  131. {
  132. row.Add(missvalue.ToInt());
  133. }
  134. }
  135. LocalMissArray.Add(row);
  136. }
  137. #endregion
  138. if (LocalMissArray.Count <= 0)
  139. return null;
  140. //当前页最大遗漏
  141. int[] maxMissArray = new int[LocalMissArray[0].Count];
  142. //当前页出现次数
  143. int[] TimesArray = new int[LocalMissArray[0].Count];
  144. //当前页遗漏总和
  145. int[] allMissArray = new int[LocalMissArray[0].Count];
  146. #region 根据当前页本期遗漏计算当前页(最大遗漏、出现次数、遗漏总和)
  147. for (int k = 0; k < LocalMissArray.Count; k++)
  148. {
  149. for (int i = 0; i < LocalMissArray[k].Count; i++)
  150. {
  151. //如果为-1说明没有遗漏数据
  152. if (LocalMissArray[k][i] == -1)
  153. {
  154. maxMissArray[i] = -1;
  155. TimesArray[i] = -1;
  156. allMissArray[i] = -1;
  157. continue;
  158. }
  159. //遍历当前页遗漏找当前页最大遗漏
  160. if (maxMissArray[i] < LocalMissArray[k][i])
  161. {
  162. maxMissArray[i] = LocalMissArray[k][i];
  163. }
  164. //遍历当前页遗漏累加当前页出现次数
  165. if (LocalMissArray[k][i] == 0)
  166. {
  167. TimesArray[i]++;
  168. }
  169. //遍历当前页遗漏累加遗漏总数
  170. if (k == 0)
  171. {
  172. allMissArray[i] = LocalMissArray[k][i];
  173. }
  174. else
  175. {
  176. if (LocalMissArray[k][i] != 0)
  177. {
  178. allMissArray[i]++;
  179. }
  180. }
  181. }
  182. }
  183. #endregion
  184. for (int i = 0; i < allMissArray.Length; i++)
  185. {
  186. if (allMissArray[i] != -1)
  187. {
  188. var f = TimesArray[i] >= 0 ? Math.Round((float)allMissArray[i] / ((float)TimesArray[i] + 1f), 0) : 0;
  189. allMissArray[i] = f < 1 ? 1 : (int)f;
  190. }
  191. }
  192. return Tuple.Create<int[], int[], int[]>(maxMissArray, allMissArray, TimesArray);
  193. }
  194. public static int[] ChargeArrayPosition(int[] array, int start, int len1, int moveTo)
  195. {
  196. var count = array.Length;
  197. var sl = start + len1;
  198. if (count == 0)
  199. return array;
  200. if (moveTo < 0 || moveTo >= count)
  201. moveTo = count;
  202. if (start < 0 || sl > count)
  203. return array;
  204. var tmpArr = new int[len1];
  205. for (int i = start; i < sl; i++)
  206. {
  207. tmpArr[i - start] = array[i];
  208. }
  209. var newArr = new int[count];
  210. var _len = 0;
  211. for (int i = 0; i < count; i++)
  212. {
  213. if (i >= start && i < sl)
  214. {
  215. _len++;
  216. if (i != moveTo)
  217. continue;
  218. }
  219. if (i == moveTo)
  220. {
  221. i -= _len;
  222. for (int j = 0; j < len1; j++)
  223. {
  224. newArr[i++] = tmpArr[j];
  225. if (_len > 0)
  226. _len--;
  227. }
  228. if (i >= count)
  229. break;
  230. }
  231. newArr[i - _len] = array[i];
  232. }
  233. if (moveTo == count)
  234. {
  235. for (var i = 0; i < len1; i++)
  236. {
  237. newArr[count - len1 + i] = tmpArr[i];
  238. }
  239. }
  240. return newArr;
  241. }
  242. public static int[] RemoveArray(int[] array, int start, int len)
  243. {
  244. var count = array.Length;
  245. if (count == 0)
  246. return array;
  247. var sl = start + len;
  248. if (start < 0 || sl > count)
  249. return array;
  250. var nlen = count - len;
  251. var newArr = new int[nlen];
  252. var _len = 0;
  253. for (var i = 0; i < count; i++)
  254. {
  255. if (i >= start && i < sl)
  256. {
  257. _len++;
  258. continue;
  259. }
  260. newArr[i - _len] = array[i];
  261. }
  262. return newArr;
  263. }
  264. public static int[] InsertToArray(int[] array, int start, int[] extArr)
  265. {
  266. var count = array.Length;
  267. if (count == 0 || extArr.Length == 0)
  268. return array;
  269. if (start < 0 || start > count)
  270. start = count;
  271. var len = extArr.Length;
  272. var nlen = count + len;
  273. var newArr = new int[nlen];
  274. var _len = 0;
  275. for (var i = 0; i < count; i++)
  276. {
  277. if (i == start)
  278. {
  279. for (var j = 0; j < len; j++)
  280. {
  281. newArr[i + (_len++)] = extArr[j];
  282. }
  283. }
  284. newArr[i + _len] = array[i];
  285. }
  286. if (start == count)
  287. {
  288. for (var i = count; i < nlen; i++)
  289. {
  290. newArr[i] = extArr[i - count];
  291. }
  292. }
  293. return newArr;
  294. }
  295. }
  296. }