我试图使用此策略
对数据表中第五列之后的每列中的值进行平均List<double> mylist = new List<double>();
for (int col = 5; col < GridData.Columns.Count; col++)
{
double avg = GridData.AsEnumerable()
.Where(x => x[GridData.Columns[col]] != DBNull.Value)
.Average(x => x.Field<double>(GridData.Columns[col]));
mylist.Add(avg);
}
已根据我在this stackoverflow question找到的内容进行了修改。
每次运行时,它都会在行上显示“指定演员无效”错误 - .Average(x => x.Field<double>(GridData.Columns[col]));
答案 0 :(得分:2)
最简单的解决方案是解析DataTable字段中的字符串,但您必须确保可以解析该值。检查一下:
List<double> mylist = new List<double>();
for (int col = 5; col < GridData.Columns.Count; col++)
{
double avg = GridData.AsEnumerable()
.Where(x => x[col] != DBNull.Value)
.Average(x => double.Parse(x[col].ToString()));
mylist.Add(avg);
}
使用TryParse
List<double> mylist = new List<double>();
for (int col = 0; col < GridData.Columns.Count; col++)
{
double a;
double avg = GridData.AsEnumerable()
.Where(x => x[col] != DBNull.Value)
.Average(x => double.TryParse(x[col].ToString(), out a) ? a:0.0);
mylist.Add(avg);
}
第三个,最安全但有冗余解析:
for (int col = 0; col < GridData.Columns.Count; col++)
{
double a;
double avg = GridData.AsEnumerable()
.Where(x => x[col] != DBNull.Value && double.TryParse(x[col].ToString(), out a))
.Average(x => double.Parse(x[col].ToString()));
mylist.Add(avg);
}
答案 1 :(得分:1)
根据您的评论,错误:
System.Data.Datarow does not contain a defintion for Field
建议使用通用扩展方法Field
:
public static T Field<T>(this DataRow row, DataColumn column)
找不到。您是否使用DataRow
的扩展方法引用了程序集?
System.Data.DataSetExtensions.dll
你应该为它添加一个using
:
using System.Data.DataSetExtensions;