亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

dataTable 運算的問題!路過的大俠幫忙看下吧!

dataTable 運算的問題!路過的大俠幫忙看下吧!

收到一只叮咚 2018-12-07 08:44:47
求跟好的思路或者方法解決! 如圖:測試數據源格式 這個查詢數據庫的已經保證了這個格式? dt列 name相等 那么下一條減去上一條 差 值相加 如果如果差值大于5或者小于0過濾 并且 下一條時間要大于上一條時間 比如 name為張三 (4-1)+(78-4) 這樣的格式 但是78-4大于5而已時間也不對 過濾 ?(4-1)+(79-78)這樣的格式 最后記錄保存 相關值 我的代碼實現 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"]) { //如果下一條時間小于上一條時間終止 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 代表當前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; } } 運行結果: 求優化或者 更好的實現方法 謝謝?
查看完整描述

3 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

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); } ? 還是建議用強實體。
查看完整回答
反對 回復 2018-12-09
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

好做法是轉成list實體集合,然后用linq查詢,壞做法是對datatable做linq查詢
查看完整回答
反對 回復 2018-12-09
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

轉化list 循環的邏輯基本上還是和我一樣的 ? 這樣的話意義不大 嗯 其實我希望linq 雖然性能會小點 謝謝你怎么晚 回答我的問題 謝謝
查看完整回答
反對 回復 2018-12-09
  • 3 回答
  • 0 關注
  • 323 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號