我有一个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中遇到一个空单元格时,它似乎不知道该怎么做。
或者,如果有一条完全不同的道路我应该走下去......请尽可能......
答案 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。
但是如果空值意味着它甚至不应该包括在平均值中......那么你需要自己计算平均值,类似于上面的帖子。
不确定我是否正确理解了这个问题...希望它有所帮助。