如何简化锯齿数组的数据返回及无null校验迭代操作?
这简直太常见了!完全可以通过给工厂类添加便捷的迭代器方法来解决这个问题,让用户彻底摆脱繁琐的null校验和双重循环。我给你几个实用的实现方案:
方法1:返回过滤后的扁平枚举(最推荐)
直接给你的工厂类新增一个方法,内部自动处理双重遍历和null校验,返回一个只包含有效元素的扁平枚举。用户拿到后直接foreach就行,完全不用关心底层数组结构。
以C#为例:
public class GridFactory { // 你已有的Generate方法 public T[][] Generate<T>() { // 原有逻辑生成带大量null的锯齿数组 } // 新增便捷方法:返回所有非null的有效元素 public IEnumerable<T> GetValidItems<T>() { var grid = Generate<T>(); foreach (var row in grid) { if (row == null) continue; // 先跳过空行 foreach (var item in row) { if (item != null) { yield return item; } } } } }
用户使用时的代码会极度简洁:
var factory = new GridFactory(); foreach (var validItem in factory.GetValidItems<MyDataType>()) { // 直接处理有效元素,完全不用管null和数组结构 }
方法2:保留行结构的过滤枚举
如果用户需要知道元素所属的行,可以返回按行分组的有效元素集合,自动过滤空行和行内的null:
public IEnumerable<IEnumerable<T>> GetValidRows<T>() { var grid = Generate<T>(); foreach (var row in grid) { if (row == null) continue; var validRow = row.Where(item => item != null); if (validRow.Any()) // 跳过全是null的行 { yield return validRow; } } }
用户使用时:
foreach (var validRow in factory.GetValidRows<MyDataType>()) { foreach (var item in validRow) { // 处理该行的有效元素,无需校验null } }
方法3:扩展方法(无法修改原工厂类时用)
要是你没办法修改已有的工厂类代码,就写个扩展方法来封装过滤逻辑:
public static class GridFactoryExtensions { public static IEnumerable<T> GetValidItems<T>(this GridFactory factory) { var grid = factory.Generate<T>(); // 复用上面的遍历过滤逻辑 foreach (var row in grid) { if (row == null) continue; foreach (var item in row) { if (item != null) yield return item; } } } }
通过这些方式,用户完全不用再手动处理双重索引和null校验,只需要调用你提供的便捷方法就能专注于业务逻辑,体验会好很多。
内容的提问来源于stack exchange,提问作者WDUK
相关产品推荐
相关产品推荐

