C# 入門 & 実践 / C sharp
4-6. インデクサ / indexer
オブジェクトを配列のように扱う。
添字部分をプロパティのようにget、setで書きます。
class IndexerTest
{
private int[] i = new int[10];
public int this[int index]
{
get
{
if (index < 0 || index >= i.Length)
{
return 0;
}
else
{
return i[index];
}
}
set
{
if (!(index < 0 || index >= i.Length))
{
i[index] = value;
}
}
}
}
class Tester
{
static void Main()
{
IndexerTest it = new IndexerTest();
it[1] = 10;
Console.WriteLine("{0}", it[1]);
}
}
文字列をインデクサに用いる
class IndexerTest
{
private string[] str_i = new string[10];
private string[] str_value = new string[10];
private int ctr = 0;
// 新規追加!
public int add(string i, string v)
{
if (ctr > str_i.Length)
{
return 0;
}
str_i[ctr] = i;
str_value[ctr] = i;
ctr++;
return 1;
}
public string this[int index]
{
get
{
if (index < 0 || index >= str_value.Length)
{
return "no data";
}
else
{
return str_value[index];
}
}
set
{
if (!(index < 0 || index >= str_value.Length))
{
str_value[index] = value;
}
}
}
// 文字列に対応する添字を探す。
public int findindex( string s )
{
int i = 0;
foreach( string ss in str_i ){
if (ss == s)
{
return i;
}
else
{
i++;
}
}
return -1;
}
// 文字列からindexへ
public string this[string index]
{
get
{
if (index.Length > 0 )
{
return this[findindex( index )];
}
else
{
return "";
}
}
set
{
if (index.Length > 0)
{
str_value[findindex(index)] = value;
}
}
}
}
class Tester
{
static void Main()
{
IndexerTest it = new IndexerTest();
it.add("日本","東京");
it.add("アメリカ", "ワシントン.D.C");
it.add("中国", "北京");
it.add("イギリス", "ロンドン");
it.add("フランス", "パリ");
Console.WriteLine("イギリス : {0}", it["イギリス"]);
Console.WriteLine("ロシア : {0}", it["ロシア"]);
}
}
イギリス : イギリス
ロシア : no data
こういう結果になります。
値を追加するときは、addメソッドを用意している。
■■■
it["イギリス"] = "ロンドン";
のような代入を可能にするには!?
変更したのは
public string this[string index]
の
set
だけですね。
class IndexerTest
{
private string[] str_i = new string[10];
private string[] str_value = new string[10];
private int ctr = 0;
// 新規追加!
public int add(string i, string v)
{
if (ctr > str_i.Length)
{
return 0;
}
str_i[ctr] = i;
str_value[ctr] = i;
ctr++;
return 1;
}
public string this[int index]
{
get
{
if (index < 0 || index >= str_value.Length)
{
return "no data";
}
else
{
return str_value[index];
}
}
set
{
if (!(index < 0 || index >= str_value.Length))
{
str_value[index] = value;
}
}
}
// 文字列に対応する添字を探す。
public int findindex( string s )
{
int i = 0;
foreach( string ss in str_i ){
if (ss == s)
{
return i;
}
else
{
i++;
}
}
return -1;
}
// 文字列からindexへ
public string this[string index]
{
get
{
if (index.Length > 0 )
{
return this[findindex( index )];
}
else
{
return "";
}
}
set
{
if (index.Length > 0)
{
int fi = findindex(index);
if(fi < 0){
// 登録されていないので
// ここで呼び出す!!!
add(index, value);
}else{
str_value[fi] = value;
}
}
}
}
}
class Tester
{
static void Main()
{
IndexerTest it = new IndexerTest();
it["日本"] = "東京";
it["アメリカ"] = "ワシントン.D.C";
it["中国"] = "北京";
it["イギリス"] = "ロンドン";
it["フランス"] = "パリ";
Console.WriteLine("イギリス : {0}", it["イギリス"]);
Console.WriteLine("ロシア : {0}", it["ロシア"]);
}
}
OKです^-^。
4-5. 配列のソート «
4. C# 入門 Level 2 »
4-7. [ ジェネリック/コレクション ] 1. ジェネリックの基本
C# 入門 & 実践 / C sharp