インデクサでは、インデックスの型と数がシグニチャとなります。これが異なればオーバーロードすることができます。
では、また簡単なサンプルを見てみましょう。
// indexover01.cs
using System;
class MyIndexer
{
int[] no;
string[] name;
public int this[string str]
{
get
{
int n = 0;
foreach (string s in name)
{
if (s == str)
return no[n];
n++;
}
return 0;
}
}
public string this[int index]
{
get
{
int n = 0;
foreach (int p in no)
{
if (p == index)
return name[n];
n++;
}
return "知りません";
}
}
public MyIndexer()
{
no = new int[5] { 100, 145, 325, 400, 155 };
name = new string[5] { "田中", "佐藤", "鈴木", "池田", "吉田" };
}
}
class indexover01
{
public static void Main()
{
MyIndexer mi = new MyIndexer();
Console.WriteLine("番号145の生徒は{0}です", mi[145]);
Console.WriteLine("番号400の生徒は{0}です", mi[400]);
Console.WriteLine("番号100の生徒は{0}です", mi[100]);
Console.WriteLine("佐藤の番号は{0}です", mi["佐藤"]);
Console.WriteLine("吉田の番号は{0}です", mi["吉田"]);
Console.WriteLine("田中の番号は{0}です", mi["田中"]);
}
}
ちょっとわかりにくいかもしれません。まずは、MyIndexerクラスのコンストラクタを見てください。
フィールドnoの配列に生徒の番号を格納しています。
フィールドnameの配列に生徒の名前を格納しています。
番号と名前はその順番に対応しています。(田中が100, 佐藤が145, 鈴木が325,...)
最初のインデクサはint this[string str]となっており、インデックスに生徒の名前を入れると生徒の番号を返すインデクサです。
foreach文でnameコレクションを順に添え字を入れていき、strと一致したら何回目(最初を0回として)で一致したか(n)を調べます。一致した時、no[n]がその生徒の番号となります。
次のインデクサは、string this[int index]となっており、インデックスに生徒の番号を入れると、名前を返します。
foreach文でnoコレクションを順に調べて、何回目でindexと一致するかを調べます。 一致したらname[n]が生徒の名前です。
ちょっとひねくれた使い方ですが、インデックスはオーバーロードされているはずです。
では、実行結果を見てみましょう。
正しく動いているようですね。
Update 08/Sep/2006 By Y.Kumei