using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CB.Entity;
namespace CB.Common
{
public class TrendDataHelpers
{
public static string RemergeTrendHtmlData(string HtmlData, int start, int end)
{
if (string.IsNullOrEmpty(HtmlData))
return null;
string _htmlData = HtmlData;
if (_htmlData.Contains("
"))
_htmlData = _htmlData.Substring(4, _htmlData.Length - 9); //去除tr标签
var constSplit = "";
var htmlArr = _htmlData.Split(new string[] { constSplit }, StringSplitOptions.RemoveEmptyEntries);
if (end == 0 || end >= htmlArr.Length)
end = htmlArr.Length - 1;
var sb = new StringBuilder();
for (var i = start; i <= end; i++)
{
sb.Append(htmlArr[i] + constSplit);
}
return sb.ToString();
}
private static string[] ExtensionEmptyCol(int emptyCount)
{
if (emptyCount <= 0)
return new string[0];
var arr = new string[emptyCount];
for (var i = 0; i < emptyCount; i++)
arr[i] = "-1";
return arr;
}
public static IEnumerable ExtensionEmptyColMissStatData(string missStatData,
int frontColCount, int behindColCount)
{
//var extmissStatData = string.Join(",", ExtensionEmptyCol(frontColCount)) + "," +
// missStatData + "," +
// string.Join(",", ExtensionEmptyCol(behindColCount));
foreach (var _s in ExtensionEmptyCol(frontColCount))
{
yield return new TrendDataStatItem { Value = _s };
}
foreach (var _s in missStatData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
if (_s == "-1") continue;
yield return new TrendDataStatItem { Value = _s };
}
foreach (var _s in ExtensionEmptyCol(behindColCount))
{
yield return new TrendDataStatItem { Value = _s };
}
}
public static IEnumerable InsertEmptyColMissStatData(string missStatData, int startIndex,
int colCount)
{
var _index = 0;
foreach (var _s in missStatData.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
if (_s == "-1") continue;
if (_index == startIndex)
foreach (var _s1 in ExtensionEmptyCol(colCount))
yield return new TrendDataStatItem { Value = _s1 };
yield return new TrendDataStatItem { Value = _s };
_index++;
}
}
public static IEnumerable ExtensionEmptyColMissStatData(int[] missStatData,
int frontColCount, int behindColCount)
{
foreach (var _s in ExtensionEmptyCol(frontColCount))
{
yield return new TrendDataStatItem { Value = _s };
}
foreach (var _i in missStatData)
{
//if (_i == -1) continue;
yield return new TrendDataStatItem { Value = _i.ToString() };
}
foreach (var _s in ExtensionEmptyCol(behindColCount))
{
yield return new TrendDataStatItem { Value = _s };
}
}
public static IEnumerable InsertEmptyColMissStatData(int[] missStatData, int startIndex,
int colCount)
{
var _index = 0;
foreach (var _i in missStatData)
{
if (_index == startIndex)
foreach (var _s1 in ExtensionEmptyCol(colCount))
yield return new TrendDataStatItem { Value = _s1 };
yield return new TrendDataStatItem { Value = _i.ToString() };
_index++;
}
}
public static void SetModelStaticData(object obj)
{
var model = obj as TrendDataEntity;
if (model == null) return;
var trendDataList = (List)model.TrendDataItems;
var lastTData = trendDataList.LastOrDefault();
model.MaxMissList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllMaxMiss.LastOrDefault(), 1, 0);
model.AvgMissList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllAvgMiss.LastOrDefault(), 1, 0);
model.AppearsList = TrendDataHelpers.ExtensionEmptyColMissStatData(lastTData.AllTimes.LastOrDefault(), 1, 0);
}
public static Tuple LocalMissData(IList list)
{
if (list == null || list.Count <= 0)
return Tuple.Create(new int[0], new int[0], new int[0]);
//将list按期号升序排列
list = list.OrderBy(info => info.Term).ToList();
//本期遗漏列表(当前页数据根据本期遗漏计算)
List> LocalMissArray = new List>();
#region 将list里面提取本期遗漏数据
foreach (var item in list)
{
var row = new List();
for (int i = 0; i < item.LocalMiss.Count(); i++)
{
if (item.LocalMiss[i] == "-1")
{
row.Add(-1);
continue;
}
foreach (var missvalue in item.LocalMiss[i].Split(','))
{
row.Add(missvalue.ToInt());
}
}
LocalMissArray.Add(row);
}
#endregion
if (LocalMissArray.Count <= 0)
return null;
//当前页最大遗漏
int[] maxMissArray = new int[LocalMissArray[0].Count];
//当前页出现次数
int[] TimesArray = new int[LocalMissArray[0].Count];
//当前页遗漏总和
int[] allMissArray = new int[LocalMissArray[0].Count];
#region 根据当前页本期遗漏计算当前页(最大遗漏、出现次数、遗漏总和)
for (int k = 0; k < LocalMissArray.Count; k++)
{
for (int i = 0; i < LocalMissArray[k].Count; i++)
{
//如果为-1说明没有遗漏数据
if (LocalMissArray[k][i] == -1)
{
maxMissArray[i] = -1;
TimesArray[i] = -1;
allMissArray[i] = -1;
continue;
}
//遍历当前页遗漏找当前页最大遗漏
if (maxMissArray[i] < LocalMissArray[k][i])
{
maxMissArray[i] = LocalMissArray[k][i];
}
//遍历当前页遗漏累加当前页出现次数
if (LocalMissArray[k][i] == 0)
{
TimesArray[i]++;
}
//遍历当前页遗漏累加遗漏总数
if (k == 0)
{
allMissArray[i] = LocalMissArray[k][i];
}
else
{
if (LocalMissArray[k][i] != 0)
{
allMissArray[i]++;
}
}
}
}
#endregion
for (int i = 0; i < allMissArray.Length; i++)
{
if (allMissArray[i] != -1)
{
var f = TimesArray[i] >= 0 ? Math.Round((float)allMissArray[i] / ((float)TimesArray[i] + 1f), 0) : 0;
allMissArray[i] = f < 1 ? 1 : (int)f;
}
}
return Tuple.Create(maxMissArray, allMissArray, TimesArray);
}
public static int[] ChargeArrayPosition(int[] array, int start, int len1, int moveTo)
{
var count = array.Length;
var sl = start + len1;
if (count == 0)
return array;
if (moveTo < 0 || moveTo >= count)
moveTo = count;
if (start < 0 || sl > count)
return array;
var tmpArr = new int[len1];
for (int i = start; i < sl; i++)
{
tmpArr[i - start] = array[i];
}
var newArr = new int[count];
var _len = 0;
for (int i = 0; i < count; i++)
{
if (i >= start && i < sl)
{
_len++;
if (i != moveTo)
continue;
}
if (i == moveTo)
{
i -= _len;
for (int j = 0; j < len1; j++)
{
newArr[i++] = tmpArr[j];
if (_len > 0)
_len--;
}
if (i >= count)
break;
}
newArr[i - _len] = array[i];
}
if (moveTo == count)
{
for (var i = 0; i < len1; i++)
{
newArr[count - len1 + i] = tmpArr[i];
}
}
return newArr;
}
public static int[] RemoveArray(int[] array, int start, int len)
{
var count = array.Length;
if (count == 0)
return array;
var sl = start + len;
if (start < 0 || sl > count)
return array;
var nlen = count - len;
var newArr = new int[nlen];
var _len = 0;
for (var i = 0; i < count; i++)
{
if (i >= start && i < sl)
{
_len++;
continue;
}
newArr[i - _len] = array[i];
}
return newArr;
}
public static int[] InsertToArray(int[] array, int start, int[] extArr)
{
var count = array.Length;
if (count == 0 || extArr.Length == 0)
return array;
if (start < 0 || start > count)
start = count;
var len = extArr.Length;
var nlen = count + len;
var newArr = new int[nlen];
var _len = 0;
for (var i = 0; i < count; i++)
{
if (i == start)
{
for (var j = 0; j < len; j++)
{
newArr[i + (_len++)] = extArr[j];
}
}
newArr[i + _len] = array[i];
}
if (start == count)
{
for (var i = count; i < nlen; i++)
{
newArr[i] = extArr[i - count];
}
}
return newArr;
}
}
}