如何在C# ASP.NET中验证DataTable第1、2、3行符合指定条件
解决验证表行条件并处理字典的问题
我来帮你搞定这个验证逻辑的问题!首先先明确你要实现的核心需求:
- 验证表中的三行数据分别符合以下规则:
- 对应AuthLevel=1的行:
Authorized必须等于1 - 对应AuthLevel=2的行:
Authorized必须是0或者null - 对应AuthLevel=3的行:
Authorized必须是0或者null
- 对应AuthLevel=1的行:
- 只有当所有行都满足条件时,才将字典
lstuserCH修改为只保留第一个元素;否则字典保持原样。
你的现有代码存在几个问题:
- 只检查了AuthLevel=1的行,但仅判断了
Authorized非空,没有验证其值是否等于1 - 完全没有处理AuthLevel=2和3的行的验证逻辑
- 字典的修改逻辑没有和所有条件都满足这个前提绑定,逻辑不完整
下面是修正后的完整代码,我会逐段解释:
Dictionary<string, BO.User> lstuserCH = new Dictionary<string, BO.User>(); // 先按AuthLevel排序,确保我们按1、2、3的顺序处理行(避免原表行顺序混乱) var sortedAuthRows = _data.wsm_PurchaseOrder_Auth .OrderBy(row => Convert.ToInt32(row["AuthLevel"])) .ToList(); bool allConditionsSatisfied = true; // 验证AuthLevel=1的行 if (sortedAuthRows.Count >= 1) { var level1Row = sortedAuthRows[0]; int authLevel = Convert.ToInt32(level1Row["AuthLevel"]); int? authorizedValue = level1Row.IsNull("Authorised") ? (int?)null : Convert.ToInt32(level1Row["Authorised"]); // 检查是否符合:AuthLevel=1 且 Authorized=1 if (!(authLevel == 1 && authorizedValue == 1)) { allConditionsSatisfied = false; // 可选:记录错误日志,比如 Console.WriteLine("AuthLevel=1的行不符合要求"); } } else { allConditionsSatisfied = false; // 可选:记录错误:缺少AuthLevel=1的行 } // 验证AuthLevel=2的行(仅当之前的条件都满足时才继续) if (allConditionsSatisfied && sortedAuthRows.Count >= 2) { var level2Row = sortedAuthRows[1]; int authLevel = Convert.ToInt32(level2Row["AuthLevel"]); int? authorizedValue = level2Row.IsNull("Authorised") ? (int?)null : Convert.ToInt32(level2Row["Authorised"]); // 检查是否符合:AuthLevel=2 且 Authorized=0或null if (!(authLevel == 2 && (authorizedValue == 0 || authorizedValue == null))) { allConditionsSatisfied = false; // 可选:记录错误日志 } } else if (sortedAuthRows.Count < 2) { allConditionsSatisfied = false; // 可选:记录错误:缺少AuthLevel=2的行 } // 验证AuthLevel=3的行(仅当之前的条件都满足时才继续) if (allConditionsSatisfied && sortedAuthRows.Count >= 3) { var level3Row = sortedAuthRows[2]; int authLevel = Convert.ToInt32(level3Row["AuthLevel"]); int? authorizedValue = level3Row.IsNull("Authorised") ? (int?)null : Convert.ToInt32(level3Row["Authorised"]); // 检查是否符合:AuthLevel=3 且 Authorized=0或null if (!(authLevel == 3 && (authorizedValue == 0 || authorizedValue == null))) { allConditionsSatisfied = false; // 可选:记录错误日志 } } else if (sortedAuthRows.Count < 3) { allConditionsSatisfied = false; // 可选:记录错误:缺少AuthLevel=3的行 } // 根据验证结果处理字典 if (allConditionsSatisfied && lstuserCH.Count > 0) { // 只保留字典的第一个元素 var firstEntry = lstuserCH.First(); lstuserCH = new Dictionary<string, BO.User> { { firstEntry.Key, firstEntry.Value } }; } // 否则字典保持原样,无需操作
代码关键点说明:
- 排序行:先按
AuthLevel排序,确保我们处理的行顺序是1→2→3,避免原表行顺序混乱导致验证错误 - 可空类型处理:用
int?来接收Authorized的值,方便同时判断0和null的情况 - 逐步验证:只有当前面的条件都满足时,才继续验证下一行,避免无效判断
- 字典修改逻辑:只有当所有行都符合条件时,才将字典修改为只保留第一个元素,否则保持原字典不变
内容的提问来源于stack exchange,提问作者user9461718
相关产品推荐
相关产品推荐

