zoukankan      html  css  js  c++  java
  • C#索引器学习笔记

        本笔记摘抄自:https://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html,记录一下学习过程以备后续查用。

        索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的。

        索引器和数组比较:

        1)索引器的索引值(Index)类型不受限制

        2)索引器允许重载

        3)索引器不是一个变量

        索引器和属性的不同点:

        1)属性以名称来标识,索引器以函数形式标识。

        2)索引器可以被重载,属性不可以。

        3)索引器不能声明为static,属性可以。

        一、下面代码演示一个简单的索引器:

        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
            }
        }

        运行结果如下:

        二、下面代码演示以字符串作为下标,对索引器进行存取。

        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
            }
        }

        运行结果如下:

        三、下面代码演示索引器的重载。

        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
            }
        }

        运行结果如下:

        四、多参索引器

        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
            }
        }

        运行结果如下:

  • 相关阅读:
    判断平衡二叉树 --牛客网
    二叉树深度 --牛客网
    重建二叉树 来源:牛客网
    快速排序
    30天自制操作系统笔记(第四天)
    pat 1047
    机器学习 周志华 第1章习题
    POJ 3126 Prime Path
    POJ 3279 Fliptile
    POJ 3278 Catch That Cow
  • 原文地址:https://www.cnblogs.com/atomy/p/12117263.html
Copyright © 2011-2022 走看看