求跟好的思路或者方法解決!
如圖:測(cè)試數(shù)據(jù)源格式 這個(gè)查詢數(shù)據(jù)庫(kù)的已經(jīng)保證了這個(gè)格式?
dt列 name相等 那么下一條減去上一條 差 值相加 如果如果差值大于5或者小于0過濾
并且 下一條時(shí)間要大于上一條時(shí)間
比如 name為張三 (4-1)+(78-4) 這樣的格式 但是78-4大于5而已時(shí)間也不對(duì) 過濾
?(4-1)+(79-78)這樣的格式
最后記錄保存 相關(guān)值
我的代碼實(shí)現(xiàn)
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("csID"));
dt.Columns.Add(new DataColumn("Name"));
dt.Columns.Add(new DataColumn("value"));
dt.Columns.Add(new DataColumn("Time"));
DataRow row = dt.NewRow();
row[0] = "1";
row[1] = "張三";
row[2] = "1";
row[3] = DateTime.Now;
dt.Rows.Add(row);
DataRow row1 = dt.NewRow();
row1[0] = "1";
row1[1] = "張三";
row1[2] = "4";
row1[3] = DateTime.Now.AddDays(1);
dt.Rows.Add(row1);
DataRow row2 = dt.NewRow();
row2[0] = "1";
row2[1] = "張三";
row2[2] = "78";
row2[3] = DateTime.Now.AddDays(-1);
dt.Rows.Add(row2);
DataRow row21 = dt.NewRow();
row21[0] = "1";
row21[1] = "張三";
row21[2] = "79";
row21[3] = DateTime.Now.AddDays(2);
dt.Rows.Add(row21);
DataRow rowt = dt.NewRow();
rowt[0] = "1";
rowt[1] = "張三";
rowt[2] = "80";
rowt[3] = DateTime.Now.AddDays(-5);
dt.Rows.Add(rowt);
DataRow row3 = dt.NewRow();
row3[0] = "2";
row3[1] = "李四";
row3[2] = "2";
row3[3] = DateTime.Now;
dt.Rows.Add(row3);
DataRow row4 = dt.NewRow();
row4[0] = "2";
row4[1] = "李四";
row4[2] = "5";
row4[3] = DateTime.Now.AddDays(1);
dt.Rows.Add(row4);
DataRow d = dt.NewRow();
d[0] = "2";
d[1] = "李四";
d[2] = "5";
d[3] = DateTime.Now.AddDays(-1);
dt.Rows.Add(d);
DataRow row5 = dt.NewRow();
row5[0] = "3";
row5[1] = "王五";
row5[2] = "3";
row5[3] = DateTime.Now.AddDays(-1);
dt.Rows.Add(row5);
var sum = 0;
var resultDt = new DataTable();
resultDt.Columns.Add("ID");
resultDt.Columns.Add("Name");
resultDt.Columns.Add("starMile");
resultDt.Columns.Add("endMile");
resultDt.Columns.Add("sumMile");
var isFlag = true;
var fistMile = "";
for (int i = 0; i < dt.Rows.Count - 1; i++)
{
var nowValue = dt.Rows[i]["value"].ToString();
var nextValue = dt.Rows[i + 1]["value"].ToString();
if (dt.Rows[i]["Name"] == dt.Rows[i + 1]["Name"])
{
//如果下一條時(shí)間小于上一條時(shí)間終止
if (DateTime.Parse(dt.Rows[i + 1]["Time"].ToString()) < DateTime.Parse(dt.Rows[i]["Time"].ToString())) continue;
//差值累加 如果大于5 并且小于過濾掉
var tempSum = int.Parse(nextValue) - int.Parse(nowValue);
if (tempSum < 5 && tempSum > 0)
{
//第一次的值
if (fistMile=="")
{
fistMile = nowValue;
}
sum += tempSum;
isFlag = false;
}
}
//name不相等 并且 isFlag為flase 代表當(dāng)前name相同的有多條(這里過濾王五)
if (dt.Rows[i]["Name"] != dt.Rows[i + 1]["Name"])
{
if (!isFlag)
{
resultDt.Rows.Add(dt.Rows[i]["csID"], dt.Rows[i]["Name"], fistMile, nowValue, sum);
}
fistMile = "";
sum = 0;
}
}
運(yùn)行結(jié)果:
求優(yōu)化或者 更好的實(shí)現(xiàn)方法 謝謝?
3 回答

翻翻過去那場(chǎng)雪
TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊
foreach (var g in dt.Rows.Cast().GroupBy(x => x["Name"]))
{
int sum = 0;
var gList = g.ToList();
if (gList.Count < 2)
{
continue;
}
for (var i = 0; i < gList.Count - 1; i++)
{
if (Convert.ToDateTime(gList[i + 1]["Time"]) < Convert.ToDateTime(gList[i]["Time"])) continue;
var x = Convert.ToInt32(gList[i + 1]["value"]) - Convert.ToInt32(gList[i]["value"]);
if (x > 0 && x < 5)
{
sum += x;
}
}
resultDt.Rows.Add(gList[0]["csID"], g.Key, gList[0]["value"], gList[gList.Count - 1]["value"], sum);
}
?
還是建議用強(qiáng)實(shí)體。

郎朗坤
TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
好做法是轉(zhuǎn)成list實(shí)體集合,然后用linq查詢,壞做法是對(duì)datatable做linq查詢

夢(mèng)里花落0921
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
轉(zhuǎn)化list 循環(huán)的邏輯基本上還是和我一樣的 ? 這樣的話意義不大 嗯 其實(shí)我希望linq 雖然性能會(huì)小點(diǎn) 謝謝你怎么晚 回答我的問題 謝謝
- 3 回答
- 0 關(guān)注
- 322 瀏覽
添加回答
舉報(bào)
0/150
提交
取消