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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 10:24:01