我有一些与二维网格(数组)一起使用的代码,并且最终得到了许多循环遍历网格中每个项目的例程。
但我认为如果我可以使用扩展方法来实现这种 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
。我想它不能作为同一个类中的私有(private)方法工作,而且显然也不能作为外部类中的私有(private)方法工作。
尽管如此,我仍然希望看到第 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
并使用<=
而不是<
上界检查。
关于c# - 在二维数组上实现 LINQ 风格的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12427204/