2012-03-02 8 views
1

ここでこの質問を読んだら、Passing one Dimension of a Two Dimensional Array in C#、多次元配列の1つのインデックスをバインドするためにC#4トリッキーを使用することができるかどうかは疑問でした。うまくいけば、このような何か:配列のラムダ式?

var matrix = new int[10, 20]; 
var row = <some dynamic magic with matrix, 7>; 

、行がマトリックスに意味的に同一である持っている[7] - その行[4]は正確行列であるので[7,4]。

これは、関数で行うのは非常に簡単です:

int some_func(int a, string b); 
var some_func_5 = (b=>some_func(5, b)); 

誰もがアイデアを持って?

+0

あなたが言及した機能は十分ではありませんか? – sll

+0

いいえ、関数は配列の意味を完全に失います。列挙できず、インデクサーもありません。 – zmbq

答えて

6

特にここでは何もできないと思います。私は個人的にそれのための特定のタイプを構築したいと思います:

public sealed class RectangularArrayView<T> : IList<T> 
{ 
    private readonly int row; 
    private readonly T[,] array; 

    public RectangularArrayView(int row, T[,] array) 
    { 
     this.row = row; 
     this.array = array; 
    } 

    public T this[int column] 
    { 
     get { return array[row, column]; } 
     set { array[row, column] = value; } 
    } 

    // etc for other IList<T> methods; use explicit interface implementation 
    // for things like Add which don't make sense on arrays 
} 
+0

はい、それは私がやったことですが、欠けていたトリックがあることを期待していました。これらのIListメソッドを実装するのは苦痛です。今、私はこの言語機能が存在するかのように見えるようにするにはどうすればいいだろうかと思います。 – zmbq

+0

@zmbq:それは言語機能にとって非常にニッチな要件のように感じます。代わりにギザギザの配列を使った場合、 'array [row]'を使って1次元の配列を返すことができることを忘れないでください。 –

+0

ああ、どういうニッチなのか分かりません。確かに、*この*特定のユースケースのためだけにそのような機能を追加する必要はありませんが、他のものにも役立つかもしれません。これはあまりにも仮説的なものであり、存在しない言語機能が未知の状況でどのように役立つのかを議論する上でのポイントはありません... – zmbq