この章では、ジャグ配列風インデクサを作ってみます。
まず、最初にジャグ配列の作り方を2次元で考えてみます。
通常の2次元配列は
データ型[,] 名前 = new データ型[要素数,要素数];のように作りました。ジャグ配列では(1次元の配列)の配列という考え方で
データ型[][] 名前 = new [要素数][];と宣言しておき、
名前[0] = new データ型[要素数]; 名前[1] = new データ型[要素数]; .....のように、各行をそれぞれnewしていきます。これだと、行ごとに要素数を変えることができますね。 また、配列の表記方法に十分注意してください。
まずは、ジャグ配列のサンプルを見てみましょう。
// jag01.cs using System; class jag01 { public static void Main() { string[][] name = new string[3][]; int i, j; name[0] = new string[2]{"田中", "佐藤"}; name[1] = new string[3]{"横井", "吉田", "工藤"}; name[2] = new string[1]{"太田"}; for (i = 0; i < 3; i++) foreach (string str in name[i]) Console.WriteLine(str); } }配列の要素の表示には、for文とforeach文を組み合わせて使っている点に注意してください。
実行結果は次のようになります。
インデクサは、public int this[int a][int b]のようには宣言できません。
そこで、無理矢理ジャグ配列風インデクサを作ってみます。(あまり意味はありません)
// jag02.cs using System; class MyClass { string[][] name; public int i; public int len { get { return name[i].Length; } } public string this[int a] { get { return name[i][a]; } set { name[i][a] = value; } } public MyClass() { i = 0; name = new string[3][]; name[0] = new string[2]; name[1] = new string[3]; name[2] = new string[2]; } } class jag02 { public static void Main() { MyClass mc = new MyClass(); mc.i = 0; mc[0] = "佐藤"; mc[1] = "田中"; mc.i = 1; mc[0] = "太田"; mc[1] = "工藤"; mc[2] = "吉田"; mc.i = 2; mc[0] = "加藤"; mc[1] = "伊藤"; for (int i = 0; i < 3; i++) { mc.i = i; for (int j = 0; j < mc.len; j++) Console.WriteLine(mc[j]); } } }まずは、MyClassクラスの
public string this[int a]{...}のところを見てください。
「これ、普通のインデクサじゃないの」
name[i][a]を返したり、これに値を設定したりしていますね。
iは何かというと、このクラスのインスタンスフィールドです。
コンストラクタを見ると、
name = new string[3][]; name[0] = new string[2]; name[1] = new string[3]; name[2] = new string[2];と、いうようにジャグ配列を作っています。結局インデクサでは (name[i])の配列に対して値を返したり、設定したりしているわけです。 ですから、このインデクサを使う前にiの値を設定しておく必要があります。 また、name[i]の配列の長さをプロパティlenで返しています。
要するに、このプログラムのインデクサはごく普通のインデクサです。
実行結果を見てみましょう。
Update 10/Sep/2006 By Y.Kumei