如何获取DataTable每行中水果与蔬菜的最高价?附代码求助
解决每行水果与蔬菜最高价的需求
数据表
Date City Apple-FT Banana-FT Potato-VG Carrot-VG 03/07 A 25 30 70 65 04/07 B 15 07 15 25
需求说明
需要获取每日**水果(FT标识)与蔬菜(VG标识)**的最高价,并对对应的最高价单元格进行背景色标记。
原代码存在的问题
- 列类型判断逻辑错误:拆分列名后取第一个元素的末尾两位判断FT,实际应直接识别列名后缀
-FT/-VG - 最大值计算范围错误:计算整行所有列的最大值,未区分水果和蔬菜类别
- 行遍历遗漏数据:从索引1开始遍历行,会跳过第一行数据
- 多层嵌套循环导致代码冗余、可读性差
修正后的实现代码
// 遍历每一行数据 foreach (DataRow row in dtRep.Rows) { // 处理水果(FT)类别的最高价 var ftColumns = dtRep.Columns.Cast<DataColumn>() .Where(col => col.ColumnName.EndsWith("-FT")) .ToList(); if (ftColumns.Any()) { decimal ftMaxValue = ftColumns.Max(col => Convert.ToDecimal(row[col])); foreach (var ftCol in ftColumns) { decimal currentValue = Convert.ToDecimal(row[ftCol]); if (currentValue == ftMaxValue) { // 标记最高价单元格(若为桌面应用,可替换为对应控件的样式设置逻辑) row[ftCol] = $"<span style='background-color: #ffcccc;'>{currentValue}</span>"; } } } // 处理蔬菜(VG)类别的最高价 var vgColumns = dtRep.Columns.Cast<DataColumn>() .Where(col => col.ColumnName.EndsWith("-VG")) .ToList(); if (vgColumns.Any()) { decimal vgMaxValue = vgColumns.Max(col => Convert.ToDecimal(row[col])); foreach (var vgCol in vgColumns) { decimal currentValue = Convert.ToDecimal(row[vgCol]); if (currentValue == vgMaxValue) { row[vgCol] = $"<span style='background-color: #ccffcc;'>{currentValue}</span>"; } } } }
代码改进说明
- 精准分类计算:分别筛选FT和VG列,单独计算各自类别的最高价,完全匹配需求
- 遍历逻辑完善:覆盖所有数据行,无数据遗漏
- 可读性提升:用LINQ简化列筛选和最大值计算,避免多层嵌套循环
- 样式区分清晰:用不同背景色标记水果、蔬菜的最高价,便于视觉区分
- 场景适配灵活:若为WinForms/WPF等桌面应用,可将HTML标记替换为对应控件的背景色设置逻辑
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

