2

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次元配列の拡張メソッドを書くことについて何かが足りませんか?

2.グリッド値を条件付きで設定できるようなパターンを実装するための推奨される方法は何ですか?上記のコードを使用して、渡された値を設定しても、元の配列には影響しません。

編集:

privateさて、元々この拡張メソッドをそれが呼び出されたのと同じクラス内に実装した後、私はそれを外部クラスに移動したときのように愚かに宣言したままにしました。同じクラスのプライベートメソッドとしては機能せず、外部クラスのプライベートメソッドとしても機能しないことは明らかだと思います。

それでも、2番目の答えを見たいと思います。

4

1 に答える 1

2

2番目の質問では、アクションは値を返さないため機能しません。そのため、配列を直接更新できませんでした。必要なのは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 に答える