【问题标题】:Conditionally average a column of data in a DataTable有条件地平均 DataTable 中的一列数据
【发布时间】:2011-07-28 19:01:06
【问题描述】:

我有一个 DataTable 对象 dTable,其中所有 DataColumn 数据类型都是字符串或双精度。列中的某些数字不存在。即=空。现在我有下面的代码找到平均值,当有值时它工作得很好。

var sum = dTable.AsEnumerable().Average(x => 
{
    if (dTable.Columns[col]!=null)
    {
       return x.Field<double>(dTable.Columns[col].ColumnName); 
    }
    else
    {
        return ???;
    };

});

我的问题是,当不满足该条件以跳过该 x 时,我应该返回什么?当我在 dTable 中遇到一个空单元格时,它似乎不知道该怎么做。

或者,如果有一条完全不同的路,我应该走下去……拜托,无论如何……

【问题讨论】:

    标签: c# linq ienumerable


    【解决方案1】:

    我认为您想要做的是首先应用Where 子句,以消除所需col 中缺少数据的任何行:

    var avg = dTable.AsEnumerable()
                 .Where(x => x[col] != DBNull.Value)
                 .Average(x => x.Field<double>(col));
    

    【讨论】:

    • 是的,我喜欢这个,但我仍然收到此错误“无法将 DBNull.Value 转换为类型 'System.Double'。请使用可为空的类型。”
    • @Brad 哎呀,忘了你的DataRow 会用DBNull.Value 代替null。更新了我的答案,以便 Where 方法检查。
    • @James 有一段时间没有真正使用过 DataTable(我猜它显示了。)
    【解决方案2】:

    使用 Linq 和 Where() 子句,这样它只会平均满足您需要的列:

    // can look up based on column index or column name...  name more losely
    // coupled in terms of ordering but index more efficient
    var sum = dTable.AsEnumerable()
        .Where(x => x[columnIndex] != DBNull.Value)
        .Average(x => x.Field<double>(columnIndex));
    

    【讨论】:

      【解决方案3】:

      我可以给你写一个简单的 for 循环吗?并不是说您*应该走这条路,而只是一种选择,因为我不习惯您拥有的那种代码

      int count = 0;
      double sum = 0.0;
      foreach(DataRow row in dTable.Rows){
        if(row[col] != DBNull.Value)
        {
          sum += row[col];  //assuming its type double, or convert it if not
          count++;
        }
      }
      double avg = sum/count;
      

      【讨论】:

      • @bemused 是的!谢谢你。我忘记了
      • 它可能归结为这一点。这肯定会奏效。我只是想要一些聪明的东西,使用 IEnumberable 之类的东西。 (努力学习新东西)
      • 似乎艾萨克为我做了这件事。如果您想将空值包含到平均值中,您可以将 count++ 保留在 if 语句之外,这是我假设的
      【解决方案4】:

      如果表中缺少该值,您可以不将其视为 0 吗?如果是这样,那么在这种情况下您可以简单地返回 0。

      但是如果空值意味着它甚至不应该包含在平均值中......那么你需要自己计算平均值,类似于上面的帖子。

      不确定我是否正确理解了这个问题...希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2017-06-18
        相关资源
        最近更新 更多