ジャグ配列ジェネレータ(ちょっとしたスニペット)
ジャグ配列を作るのって、じみ〜に面倒だったりしませんか。
そんなあなたに、ちょっとした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でアクセスするような場面には、そのあたり意識してみたりとかとか。