有条件地平均DataTable中的一列数据

时间:2011-07-28 19:01:07

标签: c# linq ienumerable

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

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

});

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

或者,如果有一条完全不同的道路我应该走下去......请尽可能......

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

使用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));

答案 2 :(得分:2)

我可以给你写一个简单的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;

答案 3 :(得分:0)

如果表中缺少值,您不能将其视为0吗?如果是这样,那么在这种情况下你只需返回0。

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

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