C#双List匹配逻辑失效:按钮启用状态设置异常排查
问题分析与解决方案
问题根源
嵌套循环导致赋值被覆盖:
原代码用两层循环遍历两个列表,但两个列表来自同一数据源,索引是一一对应的。当外层循环到r=0(对应frmMasalar)时,内层循环y=0会满足条件并将cu.frmMasalar设为1,但紧接着y=1时不满足条件,又会把值改回0,最终结果被错误覆盖。字符串大小写不匹配:
实际数据中Visible字段的值是True(首字母大写),但判断条件中用的是小写的"true",导致字符串相等判断失败。不必要的列表拆分:
将同一数据源拆分为两个独立列表,既增加代码复杂度,还可能因数据源长度变化引发索引不匹配的风险。
修复后的代码方案
方案1:简化循环逻辑
用单层循环遍历索引,找到匹配项后立即退出循环,避免赋值被覆盖:
// 默认设置为禁用状态 cu.frmMasalar = 0; for (int i = 0; i < rollerliste.Count; i++) { // 忽略大小写比较,避免大小写差异导致的判断失败 if (rollerliste[i].ToString().Equals("frmMasalar", StringComparison.OrdinalIgnoreCase) && yetkiliste[i].ToString().Equals("True", StringComparison.OrdinalIgnoreCase)) { cu.frmMasalar = 1; // 找到目标项后提前退出循环,提升效率 break; } }
方案2:直接操作数据源(更优雅高效)
跳过拆分列表的步骤,直接从原数据源中查找目标行,彻底避免索引错误:
// 从roller中查找对应角色的行 var masalarRole = roller.AsEnumerable() .FirstOrDefault(row => row["rolName"].ToString().Equals("frmMasalar", StringComparison.OrdinalIgnoreCase)); // 根据Visible字段的值设置状态,直接转bool类型避免字符串判断问题 cu.frmMasalar = masalarRole != null && Convert.ToBoolean(masalarRole["Visible"]) ? 1 : 0;
额外说明
- 优先将
Visible字段转换为bool类型判断,而非依赖字符串比较,能彻底规避大小写或格式不一致的问题。 - 如果需要批量处理多个按钮状态,可以将逻辑封装为方法,传入角色名称和对应状态字段,提升代码复用性。
内容的提问来源于stack exchange,提问作者Atakan Koç
相关产品推荐
相关产品推荐

