2012-09-14 35 views
2

我有一些代碼可以與二維網格(數組)一起工作,並且最後有很多循環遍歷網格中每個項目的例程。在二維數組上實現LINQ風格的擴展方法

但我認爲這將是很好,如果我可以做這個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]); 
} 

智能感知似乎並沒有認識到MyType[3,3]類型的對象在這個擴展方法。我是否錯過了編寫二維數組的擴展方法?

2.什麼是推薦的方式來實現這種模式,允許我有條件地設置網格值?使用上面的代碼,設置傳遞的值不會影響原始數組。

編輯:

好了,原來是同班它是從所謂的內實施這種擴展方法後,我愣神離開它宣佈爲private當我把它移動到外部類。我猜它不會在同一個類中作爲私有方法工作,並且顯然不能作爲外部類中的私有方法工作。

儘管如此,我仍然很想看到第二個答案。

+2

我很確定你不是指'私人' –

+0

D'oh!就是這樣。我最初在同一個類中使用了擴展方法,並將它設置爲私有,但是當我將它移動到一個外部類時,看起來像忘了修改它。咄! –

+0

就是這樣,你可以使擴展方法爲private,它仍然可以在你定義的靜態類中作爲擴展方法工作,它只是不能從外部訪問。儘管這樣做沒什麼意義。 –

回答

1

對於第二個問題,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並使用<=而不是<的上限檢查。

+0

是的,'ForEach'是用於沒有改變數值的程序。我的問題是,根據目前的項目,我可能會或可能不想改變它。所以我希望有一種方法,如果不需要,我不需要設置它。但也許這個建議是最好的,如果我不想改變它,我只需要返回原始值。 –