关于DataTable字段列求平均值,最大值,最小值,统计和的东东,为Null情况

该博客介绍了如何在DataTable中处理字段列的统计操作,包括当数据为DBNull时的特殊情况。通过使用IsNulL函数筛选空值,然后利用LINQ进行求和、求平均值、求最大值、求最小值和计数的计算。在计算平均值时,将DBNull转换为0并排除在总数之外,以确保计算的准确性。同时,对于最大值和最小值的求解,通过设定特定值来处理DBNull,保证结果的可靠性。

首先,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;
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值