読者です 読者をやめる 読者になる 読者になる
ようこそ。睡眠不足なプログラマのチラ裏です。

ジャグ配列ジェネレータ(ちょっとしたスニペット)

プログラミング C#2.0 C#3.0

ジャグ配列を作るのって、じみ〜に面倒だったりしませんか。
そんなあなたに、ちょっとしたC#スニペット。こんなんどうでしょう。

using System;
using System.Drawing;
using System.Runtime.CompilerServices;

namespace ConsoleApplication1
{
    public class JaggedArraysGenerator<T>
    {
        private T[][] _items;

        [IndexerName("GenericArray")]
        public T[] this[int index]
        {
            get { return _items[index]; }
        }

        public JaggedArraysGenerator(int row, int col)
        {
            _items = new T[row][];
            for (int r = 0; r < row; r++)
            {
                _items[r] = new T[col];
                for (int c = 0; c < col; c++)
                    _items[r][c] = default(T);
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            var t = new JaggedArraysGenerator<Point>(5, 10);
            t[0][0].X = 100;
            t[4][9].Y = 300;

            Console.WriteLine(t[0][0].X);
            Console.WriteLine(t[1][1].X);
            Console.WriteLine(t[4][9].Y);

            var s = new JaggedArraysGenerator<string>(10, 10);
            s[0][0] = "hoge";
            s[9][9] = "piyo";

            Console.WriteLine(s[0][0]);
            Console.WriteLine(s[1][1]);
            Console.WriteLine(s[9][9]);
           
            Console.ReadKey();
        }
    }
}


実行結果

100
0
300
hoge

piyo


上記のように、IndexerNameAttribute属性を指定することで、インデクサの名前を任意の名前に変更することができます(デフォルトはItem)。
また、上記の場合にMSIL上に展開されるメソッド名は、ちゃんとget_GenericArray(); set_GenericArray(); とかに変わります。
IndexerNameAttributeを指定しているときにReflectionでアクセスするような場面には、そのあたり意識してみたりとかとか。