You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#双List匹配逻辑失效:按钮启用状态设置异常排查

问题分析与解决方案

问题根源

  1. 嵌套循环导致赋值被覆盖:
    原代码用两层循环遍历两个列表,但两个列表来自同一数据源,索引是一一对应的。当外层循环到r=0(对应frmMasalar)时,内层循环y=0会满足条件并将cu.frmMasalar设为1,但紧接着y=1时不满足条件,又会把值改回0,最终结果被错误覆盖。

  2. 字符串大小写不匹配:
    实际数据中Visible字段的值是True(首字母大写),但判断条件中用的是小写的"true",导致字符串相等判断失败。

  3. 不必要的列表拆分:
    将同一数据源拆分为两个独立列表,既增加代码复杂度,还可能因数据源长度变化引发索引不匹配的风险。

修复后的代码方案

方案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ç

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:55:20