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