C# 索引器 学习

转载原地址: http://www.cnblogs.com/lxblog/p/3940261.html

1、索引器(Indexer):

索引器允许类或者结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于他们的访问采用参数。

最简单的索引器的使用

/// <summary>
    /// 最简单的索引器
    /// </summary>
    public class IDXer
    {
        private string[] name=new string[10];

        //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
        public string this[int index]
        {
            get
            {
                return name[index];
            }
            set
            {
                name[index] = value;
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            //最简单索引器的使用
            IDXer indexer = new IDXer();
            //“=”号右边对索引器赋值,其实就是调用其set方法
            indexer[0] = "张三";
            indexer[1] = "李四";
            //输出索引器的值,其实就是调用其get方法
            Console.WriteLine(indexer[0]);
            Console.WriteLine(indexer[1]);
            Console.ReadKey();
        }
    }

2、索引器与数组的区别:

  • 索引器的索引值(Index)类型不限定为整数:

        用来访问数组的索引值(Index)一定为整数,而索引器的索引值类型可以定义为其他类型。

  • 索引器允许重载

一个类不限定为只能定义一个索引器,只要索引器的函数签名不同,就可以定义多个索引器,可以重载它的功能。

  • 索引器不是一个变量

索引器没有直接定义数据存储的地方,而数组有。索引器具有Get和Set访问器。

3、索引器与属性的区别:

  • 索引器以函数签名方式 this 来标识,而属性采用名称来标识,名称可以任意
  • 索引器可以重载,而属性不能重载。
  • 索引器不能用static 来进行声明,而属性可以。索引器永远属于实例成员,因此不能声明为static。

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

  //以字符串为下标的索引器
    public class IDXer2
    {
        private Hashtable name = new Hashtable();

        //以字符串为下标的索引器
        public string this[string index]
        {
            get
            {
                return name[index].ToString();
            }
            set
            {
                name.Add(index, value);
            }
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            //以字符串为下标的索引器
            IDXer2 indexer2 = new IDXer2();
            indexer2["A01"] = "张三";
            indexer2["A02"] = "李四";
            Console.WriteLine(indexer2["A01"]);
            Console.WriteLine(indexer2["A02"]);
            Console.ReadKey();
        }
  }

    多参数索引器及索引器的重载

  /// <summary>
    /// 成绩类
    /// </summary>
    public class Scores
    {
        /// <summary>
        /// 学生姓名
        /// </summary>
        public string StuName { get; set; }

        /// <summary>
        /// 课程ID
        /// </summary>
        public int CourseId { get; set; }

        /// <summary>
        /// 分数
        /// </summary>
        public int Score { get; set; }

    }

    /// <summary>
    /// 查找成绩类(索引器)
    /// </summary>
    public class FindScore
    {
        private List<Scores> listScores;

        public FindScore()
        {
            listScores = new List<Scores>();
        }

        //索引器 通过名字&课程编号查找和保存成绩
        public int this[string stuName, int courseId]
        {
            get
            {
                Scores s = listScores.Find(x => x.StuName == stuName && x.CourseId == courseId);
                if (s != null)
                {
                    return s.Score;
                }
                else
                {
                    return -1;
                }
            }
            set
            {
                listScores.Add(new Scores() { StuName = stuName, CourseId = courseId, Score = value });
            }
        }

        //索引器重载,根据名字查找所有成绩
        public List<Scores> this[string stuName]
        {
            get
            {
                List<Scores> tempList = listScores.FindAll(x => x.StuName == stuName);
                return tempList;
            }
        }
    }

   static void Main(string[] args)
   {
       //多参数索引器和索引器重载
       FindScore fScore = new FindScore();
       fScore["张三", 1] = 98;
       fScore["张三", 2] = 100;
       fScore["张三", 3] = 95;
       fScore["李四", 1] = 96;
       //查找 张三 课程编号2 的成绩
       Console.WriteLine("李四 课程编号2 成绩为:" + fScore["李四", 1]);
       //查找所有张三的成绩
       List<Scores> listScores = fScore["张三"];
       if (listScores.Count > 0)
       {
          foreach (Scores s in listScores)
          {
             Console.WriteLine(string.Format("张三 课程编号{0} 成绩为:{1}", s.CourseId, s.Score));
          }
       }
       else
       {
           Console.WriteLine("无该学生成绩单");
       }
       Console.ReadKey();
   }

  

时间: 2024-10-04 03:48:52

C# 索引器 学习的相关文章

接口、索引器、Foreach的本质(学习笔记)

接口 什么是接口? 接口代表一种能力,和抽象类类似但比抽象类的抽象程度更高! 接口的定义: 1 public interface IEat//定义一个接口 2 { 3 void Eat(string food);//为该接口定义一种能力 4 } 接口的定义 从上边的例子中我们可以看到,接口中的方法是没有方法体的甚至连访问修饰符都没有.而且在接口中只能有方法.属性.索引器及事件! 接口的使用: 1 public class Dog:IEat //Dog类实现IEat接口 2 { 3 //Dog类实

C#学习笔记--this关键字和索引器

 一.this关键字 在C#中,this关键字有以下3种常见的用法: 1.用在类的属性.实例方法或实例构造方法中,区分成员名和本地变量(或参数).下面的示例声明一个名为Myclass的类,类中包括一个实例字段myVal和一个实例构造函数,该构造函数带一个名为myVal的参数,在方法中,通过this可以在语义上区分成员名myVal和参数名myVal.(注意:在实际编程中是不建议参数名和字段名相同的,这样做降低了代码的易读性,这里只是为了说明this关键字的用法而已). 1 class MyCl

public animal this[int index]|索引器的使用

学习如何使用索引器,索引器的使用是public 类型 this[int index]{get{};set{}} ,访问通过类的实例(对象)加[i], 例如animal[i],就像访问数组一样,其实就是类的数组访问的使用书写. 使用详情请看msdn. 例子如下: class IndexerClass { private int[] arr = new int[100]; public int this[int index] // Indexer declaration { get { // Che

010.里式转换、命名空间、字段属性、索引器

1.is asis:判断对象和类型的兼容 兼容---true 不兼容---false 子类兼容父类 子类对象 is 父类类型 --true对象 is 类型 (对象为此类型的对象 对象为此类型的子类的对象 --true)public class Person{}public class Student:Person{} Person per=new Person();Student stu=new Student();Person person=new Student();返回true:per i

Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2)

Lucene 5.2.1 + jcseg 1.9.6中文分词索引(Lucene 学习序列2) jcseg是使用Java开发的一个开源的中文分词器,使用流行的mmseg算法实现.是一款独立的分词组件,不是针对lucene而开发,但是提供了最新版本的lucene和solr分词接口. Java Code <span style="font-size:14px;">package com.qiuzhping.lucene; import java.sql.Connection; i

【C#】我看索引器

前沿: 索引器:索引器允许类或结构的实例就像数组一样进行索引. 索引器类似于属性,不同之处在于它们的访问器采用参数. 正文: 在看索引器前,我们先看看C#的属性,面向对象设计和编程的重要原则之一就是数据封装,也就是我们在类中定义的字段永远不应该对外公开,假如我们定义了下面一个类 public class Employee { public string Name; public int Age; } 那么我们在外面可以很随意的破换一个Employee对象: Employee e=new Empl

【Unity|C#】基础篇(7)——属性(Property) / 索引器(Indexer)

[学习资料] > 在线文档 官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程(高级教程):https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院.Siki学院         > 书籍 <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html [学习内容] > 菜鸟教程:

C#之索引器

实际中不使用这个东西,只做了解 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 索引器 { class Program { static void Main(string[] args) { person p = new person(); p[0] = 1; p[1] = 2; p[2] =

C# 索引器

索引器允许累或结构的实例像数组一样进行索引. 当你定义一个索引器时,该类的行为就会像一个虚拟数组,你可以使用数组访问运算符([]) 来访问该类的实例. 以为所引起语法如下: element-type this[int index] { // get 访问器 get { // 返回 index 指定的值 } // set 访问器 set { // 设置 index 指定的值 } } //示例代码如下: class SampleCollection<T> { private T[] arr = n