C# 如何为自定义对象二维数组实现专属foreach类遍历处理方法
实现方案
核心实现逻辑
你需要将ForEachLevel的入参从无参Action改为泛型委托Action<Level>,遍历过程中将当前拿到的Level实例传入委托执行即可。
1. 基础全量遍历方法
// 遍历所有Level实例执行指定操作 private void ForEachLevel(Action<Level> operation) { for (int r = 0; r < Rows; r++) { for (int c = 0; c < Cols; c++) { // 将当前遍历到的Level传入委托执行 operation(Levels[r, c]); } } }
调用方式非常简单:
- 如果操作方法本身仅接收
Level参数,直接传方法名即可(不要加括号,加括号会直接执行方法传返回值,这里需要传递方法本身作为委托)ForEachLevel(SetColour); - 如果需要传递额外参数,用Lambda表达式包装即可:
// 给所有Level设置红色 ForEachLevel(level => SetLevelColor(level, Color.Red));
2. 支持指定行范围的重载方法
可以新增同名重载方法,支持传入行的起止范围:
// 仅遍历[startRow, endRow]范围的Level执行指定操作 private void ForEachLevel(int startRow, int endRow, Action<Level> operation) { // 可选:增加参数合法性校验,避免数组越界 if (startRow < 0 || endRow >= Rows || startRow > endRow) throw new ArgumentOutOfRangeException("行范围不合法"); for (int r = startRow; r <= endRow; r++) { for (int c = 0; c < Cols; c++) { operation(Levels[r, c]); } } }
调用示例:
// 仅处理第2到第5行的Level ForEachLevel(2,5,SetColour);
你需要了解的C#核心概念
- 泛型委托:
Action<T>是C#预定义的泛型委托,代表没有返回值、接收1个T类型参数的方法,允许你把方法作为参数传递给其他方法。 - Lambda表达式:可以快速创建匿名委托,适合需要传递额外参数的场景,无需额外定义独立方法。
- 方法重载:允许定义多个同名但参数列表不同的方法,调用时会自动匹配对应的重载实现,适配不同的使用场景。
修正后的完整示例代码
对应你编辑2中的代码,修改后可直接运行:
private void SomeOtherMethod() { // 给所有Level设置红色 ForEachLevel(level => SetLevelColor(level, Color.Red)); // 给1到3行的Level执行SetColour逻辑 ForEachLevel(1, 3, SetColour); } // 全量遍历重载 private void ForEachLevel(Action<Level> operation) { for (int d = 0; d < Depths; d++) { for (int l = 0; l < Lanes; l++) { operation(Levels[d, l]); } } } // 指定深度范围遍历重载 private void ForEachLevel(int startDepth, int endDepth, Action<Level> operation) { if (startDepth < 0 || endDepth >= Depths || startDepth > endDepth) throw new ArgumentOutOfRangeException(nameof(startDepth), "深度范围不合法"); for (int d = startDepth; d <= endDepth; d++) { for (int l = 0; l < Lanes; l++) { operation(Levels[d, l]); } } } private void SetLevelColor(Level level, Color color) { level.Color = color; } private void SetColour(Level level) { if (/* 你的业务逻辑 */) level.Colour = Color.Red; else level.Colour = Color.Green; }
内容的提问来源于stack exchange,提问作者inter
相关产品推荐
相关产品推荐

