C# table求最大值、最小值、平均值时报System.Data.EvaluateException 未找到列错误

zk716 2017-11-16 11:13:16
各位大大帮忙看看,我用 strColumns[i]存列名,单步调试结果为下图:

实际table里的内容为下图:


当执行到maxdata[i] = Convert.ToDouble(dtResult.Compute("max(" + strColumns[i] + ")", ""));就报未找到列名,但表中和strColumns[i]都有“流量一”这个列名,不知道什么原因,倒腾了好久了,请大大们帮忙看看。
用maxdata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("流量一")).Max();语句能行,但是我这里列名实际是个变量存在strColumns[i]里的,如果用maxdata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("strColumns[i]")).Max();该怎么写。求平均值时用maxdata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("strColumns[i]")).Average();把数字为0的也算进去了,怎么去掉呢?
...全文
430 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianlang_2008 2017-11-16
  • 打赏
  • 举报
回复
初步估计和你画蛇添足有关,先把 strColumns[i] = dtResult.Columns[i].ColumnName.Replace(" ", "");这个后面替换空格的部分去掉试下
Hobo丶 2017-11-16
  • 打赏
  • 举报
回复
引用 5 楼 zk716 的回复:
更正: for(i = 1; i < dt.Columns.Count - 1; i++ ) 表中一共9列,第一列时间,后面还有8列是数据如果列-1了后,能查出来的只有7列数据了呀?
还是8个哦 你要看清楚了
zk716 2017-11-16
  • 打赏
  • 举报
回复
System.Data.DataTable dtResult = new System.Data.DataTable();//建立新表用来改变原表时间时段的数据类型,改为String //克隆表结构 dtResult = temtable.Clone(); foreach (DataColumn col in dtResult.Columns) { if (col.ColumnName == "时间") { //修改列类型 col.DataType = typeof(String); } } foreach (DataRow oldrow in temtable.Rows)//赋值原表中的数据到新表中来 { DataRow row = dtResult.NewRow(); row["时间"] = Convert.ToString(oldrow["时间"]); for (int i = 1; i < temtable.Columns.Count; i++) { row[i] = Math.Round(Convert.ToDouble(oldrow[i]), 3); } dtResult.Rows.Add(row); } Double[] maxdata = new Double[dtResult.Columns.Count];//定义数组来接收每一列的最大值 Double[] mindata = new Double[dtResult.Columns.Count];//定义数组来接收每一列的最小值 Double[] avgdata = new Double[dtResult.Columns.Count];//定义数组来接收每一列的平均值 String[] strColumns = new string[dtResult.Columns.Count];////定义数组来接收所有列名 for (int i = 1; i < dtResult.Columns.Count; i++)//对列名、最大值、最小值、平均值的数组赋值 { strColumns[i] = dtResult.Columns[i].ColumnName.Replace(" ", ""); maxdata[i] = Convert.ToDouble(dtResult.Compute("max(" + strColumns[i] + ")", "")); mindata[i] = Convert.ToDouble(dtResult.Compute("min(" + strColumns[i] + ")", "")); //maxdata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("流量一")).Max(); //mindata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("流量一")).Min(); //if (maxdata[i] == 0 && mindata[i] == 0) //{ //avgdata[i] = 0; //} //else { avgdata[i] = Convert.ToDouble(dtResult.Compute("avg(" + strColumns[i] + ")", "" + strColumns[i] + ">0")); //avgdata[i] = dtResult.AsEnumerable().Select(t => t.Field<double>("流量一")).Average(); } } DataRow dr1 = dtResult.NewRow();//增加新数据行并填充数据 for (int i = 1; i < maxdata.Length; i++) { dr1[i] = Math.Round(maxdata[i], 3); } dr1[0] = "最大值"; dtResult.Rows.Add(dr1); DataRow dr2 = dtResult.NewRow();//增加新数据行并填充数据 for (int i = 1; i < mindata.Length; i++) { dr2[i] = Math.Round(mindata[i], 3); } dr2[0] = "最小值"; dtResult.Rows.Add(dr2); DataRow dr3 = dtResult.NewRow();//增加新数据行并填充数据 for (int i = 1; i < avgdata.Length; i++) { dr3[i] = Math.Round(avgdata[i], 3); } dr3[0] = "平均值"; dtResult.Rows.Add(dr3); for (int i = 1; i < dtResult.Columns.Count; i++)//对列名、最大值、最小值、平均值的数组赋值 { int start = taglist.Rows[i-1][0].ToString().IndexOf("FIX.") + 4; int end = taglist.Rows[i-1][0].ToString().IndexOf("_PV.F_CV"); string str = taglist.Rows[i-1][0].ToString().Substring(start, end - start).TrimEnd(); dtResult.Columns[i].ColumnName += "\r\n"+"[" + str + "]"; } dataGridView1.DataSource = dtResult; dtResult.Dispose(); 代码就这样,一张表有数据用的FILL后不能求最大值最小值等,把这张表克隆到另外一张表后,用新的表对没列求最大值最小值和平均值。
zk716 2017-11-16
  • 打赏
  • 举报
回复
主要是报错,不知道哪里错了,表里列名也正常呀。
Vito1993 2017-11-16
  • 打赏
  • 举报
回复
不好意思 搞错
Vito1993 2017-11-16
  • 打赏
  • 举报
回复
唉 下标从0开始啊
zk716 2017-11-16
  • 打赏
  • 举报
回复
更正: for(i = 1; i < dt.Columns.Count - 1; i++ ) 表中一共9列,第一列时间,后面还有8列是数据如果列-1了后,能查出来的只有7列数据了呀?
Vito1993 2017-11-16
  • 打赏
  • 举报
回复
更正: for(i = 1; i < dt.Columns.Count - 1; i++ )
Vito1993 2017-11-16
  • 打赏
  • 举报
回复
引用 2 楼 zk716 的回复:
Column.Count - 1吧 第一列是时间字段,不需要求最大值,最小值,平均值呀。
for(i = 0; i < dt.Columns.Count - 1; i++ )
zk716 2017-11-16
  • 打赏
  • 举报
回复
Column.Count - 1吧 第一列是时间字段,不需要求最大值,最小值,平均值呀。
Vito1993 2017-11-16
  • 打赏
  • 举报
回复
Column.Count - 1吧

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧