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

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

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

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

或者,如果有一条完全不同的道路,我应该走下去……请务必……

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

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

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

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

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

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

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