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

如何在C# ASP.NET中验证DataTable第1、2、3行符合指定条件

解决验证表行条件并处理字典的问题

我来帮你搞定这个验证逻辑的问题!首先先明确你要实现的核心需求:

  • 验证表中的三行数据分别符合以下规则:
    • 对应AuthLevel=1的行:Authorized必须等于1
    • 对应AuthLevel=2的行:Authorized必须是0或者null
    • 对应AuthLevel=3的行:Authorized必须是0或者null
  • 只有当所有行都满足条件时,才将字典lstuserCH修改为只保留第一个元素;否则字典保持原样。

你的现有代码存在几个问题:

  1. 只检查了AuthLevel=1的行,但仅判断了Authorized非空,没有验证其值是否等于1
  2. 完全没有处理AuthLevel=2和3的行的验证逻辑
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:44:29