• C#索引器


    转自:http://www.cnblogs.com/ArmyShen/archive/2012/08/27/2659405.html

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

    索引器和数组比较:

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

    (2)索引器允许重载

    (3)索引器不是一个变量

    索引器和属性的不同点

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

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

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

    一个简单的索引器例子

    复制代码
    using System;
    using System.Collections;
    
    public class IndexerClass { private string[] name = new string[2]; //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象 public string this[int index] { //实现索引器的get方法 get { if (index < 2) { return name[index]; } return null; } //实现索引器的set方法 set { if (index < 2) { name[index] = value; } } } } public class Test { static void Main() { //索引器的使用 IndexerClass Indexer = new IndexerClass(); //“=”号右边对索引器赋值,其实就是调用其set方法 Indexer[0] = "张三"; Indexer[1] = "李四"; //输出索引器的值,其实就是调用其get方法 Console.WriteLine(Indexer[0]); Console.WriteLine(Indexer[1]); } }
    复制代码

     以字符串作为下标,对索引器进行存取

    复制代码
    public class IndexerClass
    {
        //用string作为索引器下标的时候,要用Hashtable
        private Hashtable name = new Hashtable();
    
        //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
        public string this[string index]
        {
            get { return name[index].ToString(); 
            set { name.Add(index, value); }
        }
    }
    public class Test
    {
        static void Main()
        {
            IndexerClass Indexer = new IndexerClass();
            Indexer["A0001"] = "张三";
            Indexer["A0002"] = "李四";
            Console.WriteLine(Indexer["A0001"]);
            Console.WriteLine(Indexer["A0002"]);
        }
    }
    复制代码

     索引器的重载

    复制代码
    public class IndexerClass
    {
        private Hashtable name = new Hashtable();
    
        //1:通过key存取Values
        public string this[int index]
        {
            get { return name[index].ToString(); }
            set { name.Add(index, value); }
        }
    
        //2:通过Values存取key
        public int this[string aName]
        {
            get
            {
                //Hashtable中实际存放的是DictionaryEntry(字典)类型,如果要遍历一个Hashtable,就需要使用到DictionaryEntry
                foreach(DictionaryEntry d in name)
                {
                    if (d.Value.ToString() == aName)
                    {
                        return Convert.ToInt32(d.Key);
                    }
                }
                return -1;
            }
            set
            {
                name.Add(value, aName);
            }
        }
    }
    public class Test
    {
        static void Main()
        {
            IndexerClass Indexer = new IndexerClass();
    
            //第一种索引器的使用
            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["王五"]);
        }
    }
    复制代码

     多参索引器

    复制代码
    using System;
    using System.Collections;
    
    //入职信息类
    public class EntrantInfo
    {
        //姓名、编号、部门
        private string name;
        private int number;
        private string department;
        public EntrantInfo()
        {
    
        }
        public EntrantInfo(string name, int num, string department)
        {
            this.name = name;
            this.number = num;
            this.department = department;
        }
    
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
        public int Num
        {
            get { return number; }
            set { number = value; }
        }
    
        public string Department
        {
            get { return department; }
            set { department = value; }
        }
    }
    
    //声明一个类EntrantInfo的索引器
    public class IndexerForEntrantInfo
    {
        private ArrayList ArrLst;//用于存放EntrantInfo类
        public IndexerForEntrantInfo()
        {
            ArrLst = new ArrayList();
        }
    
        //声明一个索引器:以名字和编号查找存取部门信息
        public string this[string name, int num]
        {
            get
            {
                foreach (EntrantInfo en in ArrLst)
                {
                    if (en.Name == name && en.Num == num)
                    {
                        return en.Department;
                    }
                }
                return null;
            }
            set
            {
                //new关键字:C#规定,实例化一个类或者调用类的构造函数时,必须使用new关键
                ArrLst.Add(new EntrantInfo(name, num, value));
            }
        }
    
        //声明一个索引器:以编号查找名字和部门
        public ArrayList this[int num]
        {
            get
            {
                ArrayList temp = new ArrayList();
                foreach (EntrantInfo en in ArrLst)
                {
                    if (en.Num == num)
                    {
                        temp.Add(en);
                    }
                }
                return temp;
            }
        }
    
        //还可以声明多个版本的索引器...
    }
    
    public class Test
    {
        static void Main()
        {
            IndexerForEntrantInfo Info = new IndexerForEntrantInfo();
            //this[string name, int num]的使用
            Info["张三", 101] = "人事部";
            Info["李四", 102] = "行政部";
            Console.WriteLine(Info["张三", 101]);
            Console.WriteLine(Info["李四", 102]);
    
            Console.WriteLine();
    
            //this[int num]的使用
            foreach (EntrantInfo en in Info[102])
            {
                Console.WriteLine(en.Name);
                Console.WriteLine(en.Department);
            }
        }
    }
    复制代码
  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/cugwx/p/4059890.html
Copyright © 2020-2023  润新知