c#高级-索引器

本文详细介绍了C#中的索引器概念,包括其语法、重载特性,以及如何在实际代码中使用,如访问数组元素、字典值以及自定义EmployeeIndexer类的多维度查找示例。
摘要由CSDN通过智能技术生成

1.索引器的概念

索引器的实质是将类或结构的实例像数组一样进行索引。无需显示指定类型或实例成员。索引器的访问需要使用参数

2.索引器的一些细节

1.索引器
string:表示通过索引器获取数据的类型
this:表示索引器的名字,必须是this,不能修改
index:索引的类型

2.索引器是可以进行重载的。

3.在 C# 中可以使用 this 关键字作为属性名声明索引器,并在方括号内声明参数。索引器也可以使用 C# 中任何有效的访问修饰符,在索引器中为 get 和 set 访问器前指定不同的访问修饰符即可。和属性的定义一样,索引器内也需要定义 get 和 set 访问器,其中 get 访问器返回值。 set 访问器分配值。

3.索引器的实际代码编写过程

示例代码:

        public string this[int index]
        {
            get { return Names[index]; }
            set { Names[index] = value; }
        }

其中get中index 调用索引时的索引值

set中的value是set访问器中内置的,表示调用索引器的分配值。

 基本使用规则

索引器的使用基本就是通过[]运算符对索引器进行访问和对元素进行赋值。

namespace Program_Suoyinqi
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 1, 2, 3, 4, 5 };
            string[] nums2 = { "a", "b", "c" };


            List<int> list = new List<int>();
            Dictionary<int,string> dic = new Dictionary<int,string>();

            Person p =new Person();
            Console.WriteLine(p[0]);
            Console.WriteLine(p[1]);
            p[2] = "张飞";
            Console.WriteLine(p[2]);
            Console.ReadKey();


            Console.WriteLine(p["张三"]);
            Console.WriteLine(p["李四"]);
            p["王五"] = 100;
            Console.WriteLine(p["王五"]);

            Console.ReadKey();
        }
    }

    class Person
    {
        private string[] names = { "张三", "李四", "王五", "赵六" };
        private Dictionary<string,int> dic = new Dictionary<string,int>();

        public Person()
        {
            dic.Add("张三", 1);
            dic.Add("李四", 2);
            dic.Add("王五", 3);
            dic.Add("赵六", 4);
        }

        //索引器
        //this必须是this不能更改
        //index 索引的类型

        public string this[int index]
        {
            get { return Names[index]; }
            set { Names[index] = value; }
        }
        //索引器是可以重载的
        public int this[string key]
        {
            get { return dic[key]; }
            set { dic[key] = value; }
        }

        public string[] Names { get => names; set => names = value; }//属性
    }
}

 

索引器案例

1.根据员工的姓名、编号、查找员工所在的部门

2.根据员工的姓名、部门、查找员工的编号

3.根据员工的编号、部门、查找员工的姓名

 具体代码:

namespace Program2_Suoyinqianli
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //根据员工的姓名、编号,查找员工所在部门。
            //根据员工的姓名、部门,查找员工的编号。
            //根据员工的部门、编号,查找员工的姓名。

            EmployeeIndexer emps =new EmployeeIndexer();
            string dep = emps["张三", 1];

            if(!string.IsNullOrEmpty(dep) )
            {
                Console.WriteLine(dep);
            }
            else
            {
                Console.WriteLine("查无此人");
            }

            int? id = emps["李四", "研发部"];
            if( id != null )
            {
                Console.WriteLine(id);
            }
            else
            {
                Console.WriteLine("查无此人");
            }
            Console.ReadKey();

        }
    }
    class Employee
    {
        public string Name { get; set;}
        public int ID {  get; set;}//员工编号
        public string Deparment { get; set;}//员工部门

        public Employee(string name, int id,string department)
        {
            this.Name = name;
            this.ID = id;
            this.Deparment = department;
        }
    }

    class EmployeeIndexer
    {
        private List<Employee> listEmps= new List<Employee>();
        public EmployeeIndexer()
        {
            listEmps.Add(new Employee("张三", 1, "行政部"));
            listEmps.Add(new Employee("李四", 2, "财务部"));
            listEmps.Add(new Employee("王五", 3, "研发部"));
            listEmps.Add(new Employee("赵六", 4, "人事部"));
        }

        public string this[string name ,int id]
        {
            get
            {
                for(int i = 0;i< listEmps.Count; i++)
                {
                    if (listEmps[i].Name == name && listEmps[i].ID == id)
                    {
                        return listEmps[i].Deparment;
                    }
                }
                return null;
            }
        }
        //根据员工的姓名、部门,查找员工的编号。
        public int? this[string name,string dep]
        {
            get
            {
                for(int i = 0;i< listEmps.Count; i++)
                {
                    if (listEmps[i].Name == name && listEmps[i].Deparment == dep)
                    {
                        return listEmps[i].ID;
                    }
                }
                return null;
            }
        }

        //根据员工的部门、编号,查找员工的姓名。
        public string this[int id, string dep]
        {
            get
            {
                for (int i = 0; i < listEmps.Count; i++)
                {
                    if (listEmps[i].ID == id && listEmps[i].Deparment == dep)
                    {
                        return listEmps[i].Name;
                    }
                }
                return null;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值