DataGridView两列求和的Linq最大值计算问题(含空单元格场景)
解决DataGridView中含空单元格的列求和最大值计算问题
原代码的核心问题是直接过滤掉了vHigh或VLow列为空的行,但实际业务场景中空单元格应该视为0参与求和,导致本该纳入计算的行被排除,无法得到正确的最大值。
改进后的代码
double MaxSales = dgvSales.Rows.Cast<DataGridViewRow>() .Where(row => row.Cells["Jaar"].Value?.ToString() == lblSelectedJaar.Text) .Select(row => { // 空单元格视为0参与计算 double vHigh = row.Cells["vHigh"].Value is DBNull ? 0 : Convert.ToDouble(row.Cells["vHigh"].Value); double vLow = row.Cells["VLow"].Value is DBNull ? 0 : Convert.ToDouble(row.Cells["VLow"].Value); return vHigh + vLow; }) .DefaultIfEmpty(0) // 无符合条件数据时返回0,避免Max方法抛出异常 .Max();
关键改进点
- 空值处理:不再过滤含空单元格的行,而是将
DBNull.Value转换为0后参与求和,确保所有符合年份条件的行都被纳入计算 - 空安全访问:用
?.ToString()处理Jaar列可能为空的情况,避免空引用异常 - 空序列防护:添加
DefaultIfEmpty(0),当筛选后没有匹配的行时,Max方法会返回默认值0,不会抛出InvalidOperationException
原代码的Where条件会剔除任何vHigh或VLow为空的行,比如某行vHigh为空但VLow有值,这行的求和值(0+VLow值)本可能是最大值,却被直接排除了,这就是结果不准确的原因。改进后的逻辑更贴合实际业务需求,能正确计算所有符合年份条件的行的求和最大值。
内容的提问来源于stack exchange,提问作者Ronald Roenhorst
相关产品推荐
相关产品推荐

