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
{
///
/// 以字符串作为下标,对索引器进行存取。
///
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
{
///
/// 索引器的重载
///
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
    }
}

运行结果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值