gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:53 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com