C#索引器學習筆記

    本筆記摘抄自:https://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html,記錄一下學習過程以備後續查用。html

    索引器容許類或者結構的實例按照與數組相同的方式進行索引取值,索引器與屬性相似,不一樣的是索引器的訪問是帶參的。數組

    索引器和數組比較:函數

    1)索引器的索引值(Index)類型不受限制學習

    2)索引器容許重載this

    3)索引器不是一個變量spa

    索引器和屬性的不一樣點:3d

    1)屬性以名稱來標識,索引器以函數形式標識。code

    2)索引器能夠被重載,屬性不能夠。htm

    3)索引器不能聲明爲static,屬性能夠。對象

    1、下面代碼演示一個簡單的索引器:

    class Program
    {
        /// <summary>
        /// 簡單的索引器類
        /// </summary>
        public class SimpleIndexerClass
        {
            private readonly string[] name = new string[2];

            /// <summary>
            /// 索引器必須以this關鍵字定義,其實這個this就是類實例化以後的對象。
            /// </summary>
            /// <param name="index"></param>
            /// <returns></returns>
            public string this[int index]
            {
                get //實現索引器的get方法
                {
                    if (index < 2)
                    {
                        return name[index];
                    }
                    return null;
                }
                set //實現索引器的set方法
                {
                    if (index < 2)
                    {
                        name[index] = value;
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            #region 簡單的索引器
            //索引器的使用
            SimpleIndexerClass indexer = new SimpleIndexerClass();
            //「=」號右邊對索引器賦值,其實就是調用其set方法。
            indexer[0] = "張三";
            indexer[1] = "李四";
            //輸出索引器的值,其實就是調用其get方法。
            Console.WriteLine(indexer[0]);
            Console.WriteLine(indexer[1]);
            Console.Read();
            #endregion
        }
    }

    運行結果以下:

    2、下面代碼演示以字符串做爲下標,對索引器進行存取。

    class Program
    {
        /// <summary>
        /// 以字符串做爲下標,對索引器進行存取。
        /// </summary>
        public class StringIndexerClass
        {
            //用string做爲索引器下標的時候,要用Hashtable。
            private Hashtable name = new Hashtable();

            /// <summary>
            /// 索引器必須以this關鍵字定義,其實這個this就是類實例化以後的對象。
            /// </summary>
            /// <param name="index"></param>
            /// <returns></returns>
            public string this[string index]
            {
                get
                {
                    return name[index].ToString();
                }
                set
                {
                    name.Add(index, value);
                }
            }
        }

        static void Main(string[] args)
        {
            #region 以字符串做爲下標,對索引器進行存取。
            StringIndexerClass Indexer = new StringIndexerClass();
            Indexer["A0001"] = "張三";
            Indexer["A0002"] = "李四";
            Console.WriteLine(Indexer["A0001"]);
            Console.WriteLine(Indexer["A0002"]);
            Console.Read();
            #endregion
        }
    }

    運行結果以下:

    3、下面代碼演示索引器的重載。

    class Program
    {
        /// <summary>
        /// 索引器的重載
        /// </summary>
        public class OverloadIndexerClass
        {
            private Hashtable name = new Hashtable();

            //第一種索引器:經過key存取Values
            public string this[int index]
            {
                get
                {
                    return name[index].ToString();
                }
                set
                {
                    name.Add(index, value);
                }
            }

            //第二種索引器:經過Values存取key
            public int this[string addName]
            {
                get
                {
                    //Hashtable中實際存放的是DictionaryEntry(字典)類型
                    //若是要遍歷一個Hashtable,就須要使用到DictionaryEntry。
                    foreach (DictionaryEntry dict in name)
                    {
                        if (dict.Value.ToString() == addName)
                        {
                            return Convert.ToInt32(dict.Key);
                        }
                    }
                    return -1;
                }
                set
                {
                    name.Add(value, addName);
                }
            }
        }

        static void Main(string[] args)
        {
            #region 索引器的重載
            OverloadIndexerClass Indexer = new OverloadIndexerClass();

            //第一種索引器的使用
            Indexer[1] = "張三";  //set訪問器的使用
            Indexer[2] = "李四";
            Console.WriteLine("編號爲1的名字:" + Indexer[1]); //get訪問器的使用
            Console.WriteLine("編號爲2的名字:" + Indexer[2]);
            Console.WriteLine();

            //第二種索引器的使用
            Console.WriteLine("張三的編號是:" + Indexer["張三"]);   //get訪問器的使用
            Console.WriteLine("李四的編號是:" + Indexer["李四"]);
            Indexer["王五"] = 3;  //set訪問器的使用
            Console.WriteLine("王五的編號是:" + Indexer["王五"]);
            Console.Read();
            #endregion
        }
    }

    運行結果以下:

    4、多參索引器

    class Program
    {
        /// <summary>
        /// 入職信息類
        /// </summary>
        public class EntrantInfo
        {
            //工號
            public int JobNumber { get; set; }
            //姓名
            public string Name { get; set; }
            //部門
            public string Department { get; set; }
            /// <summary>
            /// 無參構造函數
            /// </summary>
            public EntrantInfo()
            {

            }
            /// <summary>
            /// 有參構造函數
            /// </summary>
            /// <param name="jobNumber">工號</param>
            /// <param name="name">姓名</param>
            /// <param name="department">部門</param>
            public EntrantInfo(int jobNumber, string name, string department)
            {
                JobNumber = jobNumber;
                Name = name;
                Department = department;
            }
        }

        //聲明一個類EntrantInfo的索引器
        public class EntrantInfoIndexerClass
        {
            private readonly ArrayList arrayList;    //用於存放EntrantInfo類
            public EntrantInfoIndexerClass()
            {
                arrayList = new ArrayList();
            }

            //聲明一個索引器:以姓名及部門查找工號。
            public int this[string name, string department]
            {
                get
                {
                    foreach (EntrantInfo ei in arrayList)
                    {
                        if (ei.Name == name && ei.Department == department)
                        {
                            return ei.JobNumber;
                        }
                    }
                    return -1;
                }
                set
                {
                    //new關鍵字:C#規定,實例化一個類或者調用類的構造函數時,必須使用new關鍵。
                    arrayList.Add(new EntrantInfo(value, name, department));
                }
            }

            //聲明一個索引器:以工號查找姓名和部門。
            public ArrayList this[int jobNumber]
            {
                get
                {
                    ArrayList alFind = new ArrayList();
                    foreach (EntrantInfo ei in arrayList)
                    {
                        if (ei.JobNumber == jobNumber)
                        {
                            alFind.Add(ei);
                        }
                    }
                    return alFind;
                }
            }

            //還能夠聲明多個版本的索引器...
        }

        static void Main(string[] args)
        {
            #region 多參索引器
            EntrantInfoIndexerClass indexer = new EntrantInfoIndexerClass();
            //this[string name, string department]的使用
            indexer["張三", "行政人事部"] = 101;
            indexer["李四", "行政人事部"] = 102;
            Console.WriteLine("行政人事部張三的工號:" + indexer["張三", "行政人事部"]);
            Console.WriteLine("行政人事部李四的工號:" + indexer["李四", "行政人事部"]);
            Console.WriteLine();
            //this[int jobNumber]的使用
            foreach (EntrantInfo ei in indexer[101])
            {
                Console.WriteLine("工號101的姓名:" + ei.Name);
                Console.WriteLine("工號101的部門:" + ei.Department);
            }
            Console.Read();
            #endregion
        }
    }

    運行結果以下:

相關文章
相關標籤/搜索