平均DataTable列 - 指定的Cast无效

时间:2013-03-31 21:06:49

标签: c# linq datatable average

我试图使用此策略

对数据表中第五列之后的每列中的值进行平均
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]));

2 个答案:

答案 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;