c# - 在二维数组上实现 LINQ 风格的扩展方法

标签 c# arrays extension-methods

我有一些与二维网格(数组)一起使用的代码,并且最终得到了许多循环遍历网格中每个项目的例程。

但我认为如果我可以使用扩展方法来实现这种 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/

相关文章:

python - 根据另一个引用数组从一个数组中选择接近的匹配项

c# - 如何扩展同名方法并被调用?

c#-4.0 - 扩展方法可以修改扩展类值吗?

c# - 如何为方法创建命名 `params` 参数?

java - 查找查找整数数组最小值的算法实现中的错误

javascript - 如何从对象数组中的每个对象中取出两个元素并创建一个新元素

typescript - TypeScript中数字的扩展方法

c# - 如何确保只能从特定类调用类方法?

C# 在任务中更新 UI

c# - 紧凑框架中的网络浏览器