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

如何用C# DataRow实现连续空行的合规性验证逻辑?

嘿,我刚好处理过类似的空行验证需求,下面给你一套基于C# DataRow的完整实现,完全贴合你说的规则:

连续空行验证规则梳理

先再明确下咱们要实现的核心逻辑,避免歧义:

  • 仅1行单独空行:记录错误,继续检查后续行
  • 连续2行空行:检查下一行
    • 若下一行仍为空(即连续3行及以上空行):记录错误
    • 若下一行非空:直接通过,不报错
C# DataRow 实现代码

我把逻辑封装成了一个可复用的工具类,支持自定义“空行”的判断标准,灵活性拉满:

using System;
using System.Collections.Generic;
using System.Data;

public static class RowValidationHelper
{
    /// <summary>
    /// 验证DataRow集合中的连续空行规则,返回错误行索引列表
    /// </summary>
    /// <param name="rows">待验证的DataRow集合</param>
    /// <param name="isRowEmptyFunc">判断某一行是否为空的自定义逻辑(可根据实际单元格非空规则调整)</param>
    /// <returns>错误行的索引列表(从0开始)</returns>
    public static List<int> ValidateConsecutiveEmptyRows(DataRowCollection rows, Func<DataRow, bool> isRowEmptyFunc)
    {
        var errorRowIndices = new List<int>();
        int consecutiveEmptyCount = 0;

        for (int i = 0; i < rows.Count; i++)
        {
            DataRow currentRow = rows[i];
            bool isCurrentEmpty = isRowEmptyFunc(currentRow);

            if (isCurrentEmpty)
            {
                consecutiveEmptyCount++;
                // 单一行空行:记录错误
                if (consecutiveEmptyCount == 1)
                {
                    errorRowIndices.Add(i);
                }
                // 连续3行及以上空行:记录当前行错误
                else if (consecutiveEmptyCount >= 3)
                {
                    errorRowIndices.Add(i);
                }
            }
            else
            {
                // 当前行非空,重置连续空行计数
                consecutiveEmptyCount = 0;
            }
        }

        // 单独处理表格末尾的连续空行
        if (consecutiveEmptyCount == 1)
        {
            errorRowIndices.Add(rows.Count - 1);
        }
        else if (consecutiveEmptyCount >= 3)
        {
            // 把末尾连续3+行的空行都加入错误列表
            for (int i = rows.Count - consecutiveEmptyCount; i < rows.Count; i++)
            {
                errorRowIndices.Add(i);
            }
        }

        return errorRowIndices;
    }

    /// <summary>
    /// 默认的行空判断逻辑:所有单元格都为空或空白字符串
    /// </summary>
    public static bool IsRowEmptyDefault(DataRow row)
    {
        foreach (var item in row.ItemArray)
        {
            if (item != DBNull.Value && !string.IsNullOrWhiteSpace(item.ToString()))
            {
                return false;
            }
        }
        return true;
    }
}
代码关键点说明
  1. 自定义空行判断:通过isRowEmptyFunc委托,你可以灵活定义什么是“空行”——比如只检查特定几列是否为空,而不是所有列,默认实现是检查所有单元格是否为空或空白字符串。
  2. 连续空行计数跟踪:用consecutiveEmptyCount变量实时跟踪当前连续空行的数量,根据计数触发不同的错误逻辑:
    • 计数=1:记录当前行错误
    • 计数=2:不做错误记录,仅继续跟踪
    • 计数>=3:记录当前行错误
  3. 末尾空行处理:循环结束后单独处理表格末尾的连续空行,避免遗漏最后几行的验证场景。
调用示例

假设你有一个DataTable需要验证,直接调用工具类即可:

// 示例:验证DataTable dt的行
var errorRows = RowValidationHelper.ValidateConsecutiveEmptyRows(dt.Rows, RowValidationHelper.IsRowEmptyDefault);

if (errorRows.Count > 0)
{
    Console.WriteLine("存在不符合规则的空行,行号(从1开始):");
    foreach (var index in errorRows)
    {
        Console.WriteLine($"行 {index + 1}"); // 转换成用户习惯的1起始行号
    }
}
else
{
    Console.WriteLine("空行验证通过!");
}

内容的提问来源于stack exchange,提问作者Gerle Batde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:23:01