【问题标题】:Averaging DataTable Columns - Specified Cast is Invalid平均数据表列 - 指定的转换无效
【发布时间】:2013-03-31 21:06:48
【问题描述】:

我正在尝试使用此策略对数据表中第五列之后的每一列中的值进行平均

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 =&gt; x.Field&lt;double&gt;(GridData.Columns[col]));

【问题讨论】:

    标签: c# linq datatable average


    【解决方案1】:

    最简单的解决方案是仅解析 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);
                }
    

    【讨论】:

    • 您提供的第一个解决方案允许代码运行并且列表填充平均值。但是,所有平均值似乎都不正确,所以我不确定这是否解决了我的根本问题。如果我计算的列中的所有值都是浮点数,为什么它会抱怨以字符串开头?
    • 我不完全理解你的问题,我尝试了代码,它适用于一些示例 DataTable。我建议第三种解决方案。我发现最好的,虽然你会解析每个值两次,但不是双倍的值不会加起来为 0.0。
    【解决方案2】:

    根据您的评论,错误:

    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;
    

    【讨论】:

    • 当我尝试 .Average(x =&gt; x.Field&lt;double&gt;(Convert.ToDouble(GridData.Columns[col]))); 时,它不会编译并且我收到错误“System.Data.Datarow 不包含字段的定义”和“无法从双精度转换为字符串”。当我尝试.Average(x =&gt; x.Field&lt;double&gt;((double)GridData.Columns[col])); 时,它也不会编译并且我得到相同的两个错误以及“无法将“System.Data.DataColumn 转换为双精度”和“无法从双精度转换为字符串”
    • 是的。我刚刚检查并引用了它。但是,当尝试使用 using 列出它时,它不会作为一个选项出现。
    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多