首先,EndDataS是一张不为空的表,里面列有的cell是DBNull。
switch (Type)
{
case 1:
DataRow[] drs = EndDataS.Select(@"IsNull([" + name + "],'')=''");
//name是列名,前面用@是绝对字符。这句话表,在EndDataS里面选择Cell为DBNull数据类型的行--也就是NUll的说法(因为table和数据库里面存储的null是不一样的格式)。
if (drs.Length > 0)
{
double fnub = EndDataS.AsEnumerable().Sum(Q => Q[name] == DBNull.Value ? 0 : Convert.ToDouble(Q[name]));//求和可以把NUll转换成0求和,后面不影响求平均值。
dr[Index] = Math.Round(fnub / (EndDataS.Rows.Count - drs.Length), 2);//这里求平均值,前面为NUll是加的0,这里减去为Null行数,就是列的平均值了。
}
else
{
dr[Index] = Math.Round(EndDataS.AsEnumerable().Average(Q => Q[name] == DBNull.Value ? 0 : Convert.ToDouble(Q[name])), 2); break;
}
break;
case 2: dr[Index] = EndDataS.AsEnumerable().Max(Q => Q[name] == DBNull.Value ? -88888 : Convert.ToDouble(Q[name])); break;//这里为Null的可以设置为一个比较小的数,那么取出来的最大值,可以有一定保证。
case 3: dr[Index] = EndDataS.AsEnumerable().Min(Q => Q[name] == DBNull.Value ? 88888 : Convert.ToDouble(Q[name])); break;//这里为NUll的可以设置为一个比较大的数,取出最小值,可以有一定的保证。
case 4: dr[Index] = EndDataS.AsEnumerable().Count(Q => Q[name] != DBNull.Value); break;//这里可以取出不为Null的cell的行数Of某列。
default: break;
}