2

我有一些适用于二维网格(数组)的代码,最后我得到了很多循环遍历网格中每个项目的例程。

但我认为如果我可以使用扩展方法来实现这种 LINQ 风格会很好。

这是我到目前为止所尝试的:

private static void ForEach(this MyType[,] grid, Action<MyType> action)
{
    for (int row = 0; row < grid.GetUpperBound(0); row++)
        for (int col = 0; col < grid.GetUpperBound(1); col++)
            action(grid[row, col]);
}

1. Intellisense 似乎无法识别类型对象上的这种扩展方法MyType[3,3]。我是否错过了为二维数组编写扩展方法的内容?

2.实现这种允许我有条件地设置网格值的模式的推荐方法是什么?使用上面的代码,设置传递的值不会影响原始数组。

编辑:

好的,在最初在调用它的同一个类中实现这个扩展方法之后,我愚蠢地将它声明为private当我将它移到外部类时。我猜它不会在同一个类中作为私有方法工作,而且它显然不会作为外部类中的私有方法工作。

不过,仍然希望看到 2 号的答案。

4

1 回答 1

2

对于您的第二个问题,Action 将不起作用,因为它不返回值,因此它无法直接更新数组。您可能想要的是一个Func<MyType,MyType>将接受原始值、进行一些处理并返回一个值,然后您的 ForEach 将把它放回数组中。如果您需要知道行和列,请将其设为Func<MyType, int, int>.

作为旁注,我不会调用它,ForEach因为您正在修改基础集合(这ForEach在普通集合中无法做到)。我会称之为UpdateAll或类似的东西。

所以你最终会得到类似的东西:

public static void UpdateAll(this MyType[,] grid, Func<MyType,MyType> action)
{
    for (int row = grid.GetLowerBound(0); row <= grid.GetUpperBound(0); row++)
        for (int col = grid.GetLowerBound(1); col <= grid.GetUpperBound(1); col++)
            grid[row, col] = action(grid[row, col]);
}

请注意,它使用GetLowerBound并使用<=而不是<上界检查。

于 2012-09-14T15:20:01.290 回答