如何用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; } }
代码关键点说明
- 自定义空行判断:通过
isRowEmptyFunc委托,你可以灵活定义什么是“空行”——比如只检查特定几列是否为空,而不是所有列,默认实现是检查所有单元格是否为空或空白字符串。 - 连续空行计数跟踪:用
consecutiveEmptyCount变量实时跟踪当前连续空行的数量,根据计数触发不同的错误逻辑:- 计数=1:记录当前行错误
- 计数=2:不做错误记录,仅继续跟踪
- 计数>=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
相关产品推荐
相关产品推荐

