如何优雅检查所有数组的Count是否一致?含空数组处理需求
优雅实现数组校验与逐元素处理
一、统一检查数组长度匹配(含Null处理)
你可以通过将所有数组放入集合,结合LINQ简化长度校验逻辑,同时处理Null情况:
// 包含所有待校验的数组(可扩展至8个) var arrays = new[] { array1, array2, array3, /* ... 其余5个数组 */ }; // 处理Null:将Null数组视为空数组(长度0),也可根据需求改为判定为无效 var validArrays = arrays.Select(arr => arr ?? Array.Empty<string>()).ToArray(); // 检查所有数组长度是否一致 bool allLengthsMatch = validArrays.Select(arr => arr.Length).Distinct().Count() == 1;
如果Null数组本身就属于异常情况,可以提前判断:
if (arrays.Any(arr => arr == null) || !allLengthsMatch) { // 存在Null数组或长度不匹配,停止处理 }
二、整合三个停止条件的逐元素处理
结合你补充的三个停止条件,需要按索引逐个验证,触发任一条件则终止后续处理。以下是完整实现:
步骤说明
- 将逗号分隔字符串分割为数组,处理空输入/Null的情况
- 统一将Null数组转为空数组,避免空引用异常
- 以最短数组长度为边界,逐个索引检查三个条件
- 触发条件则立即停止循环
示例代码
// 模拟8个逗号分隔输入(示例仅展示3个,其余可同理扩展) string inputName = "Tom,Mary,Jerry"; string inputAge = "10,11,12"; string inputGender = "male,Error"; // 分割字符串为数组,空输入转为Null,再统一处理为非Null数组 var nameArray = string.IsNullOrEmpty(inputName) ? null : inputName.Split(','); var ageArray = string.IsNullOrEmpty(inputAge) ? null : inputAge.Split(','); var genderArray = string.IsNullOrEmpty(inputGender) ? null : inputGender.Split(','); var allArrays = new[] { nameArray, ageArray, genderArray /* ... 其余5个数组 */ } .Select(arr => arr ?? Array.Empty<string>()) .ToArray(); // 取最短数组长度作为最大可遍历索引边界 int maxProcessIndex = allArrays.Min(arr => arr.Length); for (int i = 0; i < maxProcessIndex; i++) { // 检查条件2:当前索引存在空元素 bool hasEmptyElement = allArrays.Any(arr => string.IsNullOrEmpty(arr[i])); // 检查条件3:当前索引存在'Error'元素 bool hasErrorElement = allArrays.Any(arr => arr[i] == "Error"); if (hasEmptyElement || hasErrorElement) { // 触发停止条件,终止后续处理 break; } // 处理当前有效记录 Console.WriteLine($"处理记录:姓名={nameArray[i]}, 年龄={ageArray[i]}, 性别={genderArray[i]}"); }
示例运行结果
针对你提供的测试数据:
var nameArray = new string[] {"Tom","Mary","Jerry"}; var ageArray = new string[] {"10","11","12"}; var genderArray = new string[] {"male","Error"};
代码只会输出:处理记录:姓名=Tom, 年龄=10, 性别=male。索引1时genderArray[1]为Error触发停止,索引2因genderArray长度不足,不会进入循环处理。
三、复用性优化:封装校验方法
如果需要多次复用校验逻辑,可以封装为单独方法:
private static bool CanProcessElement(string[][] arrays, int index) { return arrays.All(arr => index < arr.Length) && !arrays.Any(arr => string.IsNullOrEmpty(arr[index])) && !arrays.Any(arr => arr[index] == "Error"); }
调用时简化循环:
int maxIndex = allArrays.Min(arr => arr.Length); for (int i = 0; i < maxIndex; i++) { if (!CanProcessElement(allArrays, i)) break; // 处理当前记录 }
内容的提问来源于stack exchange,提问作者gymcode
相关产品推荐
相关产品推荐

