也谈索引器

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

如:简单索引器实例:

 using System;

 using System.Collections.Generic;

 using System.Linq; using System.Text;

namespace ConsoleApplication2

 {

       class Program

           {

                 static void Main(string[] args)

        {

           IndexClass Temple = new IndexClass();

           Temple[0] = "孙三";

          Temple[1] = "业四";

          Temple[2] = "宝五";

          Console.WriteLine("冠位大爷为:{0}",Temple[0]);

           Console.WriteLine("亚位大爷为:{0}", Temple[1]);

           Console.WriteLine("季位大爷为 :{0}", Temple[2]);

           Console.ReadLine();

        }

  }

     class IndexClass

       {

        private string[] name = new string[100];

        public string this[int index]

         {

           get {

                   if  (index=100)

                     return name[0];

                  else

                       return name[index];

             }

         set

            {

                  if   (index < 0 || index > 100)

                    name[0] = value;

                  else

                    this.name[index] = value;

            }

         }

       }

}

上例中的索引器与数组有些相似:但是索引器与数组是有区别的体现在如下:

 1)索引器的索引值不受类型的限制。而用来访问数组的索引值一琮是整数。

 2)索引器允许重载,一个类可以有多个索引器。

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

 4)属性以名称来标识,索引器以函数签名来标识。索引器可以被重载,属性则不可以被重载。属性可以为静态的,索引器属于实例成员,不能被声明为static。

 而且索引器可以是多参的也就是作为索引的参数可以为多个如下:

 using System;

 using System.Collections.Generic;

 using System.Linq; using System.Text;

using System.Collections;

 namespace ConsoleApplication2

{

   class Program

      {

      static void Main(string[] args)

        {

          ScoreIndex si = new ScoreIndex();

           si["张三", 1] = 90;

           si["张三", 2] = 100;

           si["张三", 3] = 98;

           si["李四", 1] = 94;

           si["李四", 2] = 88;

           si["李四", 3] = 96;

           Console.WriteLine("张三的编号为1 的成绩为:{0}",si["张三",1]);

          Console.WriteLine("张三的所有成绩为: ");

           ArrayList arrTemp; arrTemp=si["张三"];

           foreach (IndexClass item in arrTemp)

             {

              Console.WriteLine("姓名:"+item.Name+" 课程编号: "+item.CourseId+" 成绩: "+item.Score+"\r\n");

             }

          Console.ReadLine();

         }

}

   class IndexClass

    {

     private string _name;

     private int _courseId;

     private int _score;

    public IndexClass(string _name,int _courseId,int _score)

       {

         this._name = _name;

         this._courseId = _courseId;

         this._score = _score;

       }

     public string Name

       {

        get { return _name; }

        set { _name = value; }

       }

    public int CourseId

      {

        get { return _courseId; }

         set { _courseId = value; }

       }

    public int Score

    {

       get { return _score; }

       set { _score = value; }

     }

 }

  class ScoreIndex

   {

    private ArrayList arr;

     public ScoreIndex()

      {

        arr = new ArrayList();

      }

   public int this[string _name, int _courseId]

    {

       get

        {

             foreach (IndexClass item in arr)

               {

                   if   (item.Name == _name && item.CourseId == _courseId)

                     {

                      return item.Score;

                   }

               }

             return -1;

         }

       set

         {

             arr.Add(new IndexClass(_name,_courseId,value));

          }

      }

        //重载索引器

       public ArrayList this[string _name]

        {

           get {

                 ArrayList temp = new ArrayList();

                 foreach (IndexClass a in arr)

                {

                     if (a.Name == _name)

                       {

                           temp.Add(a);

                       }

                }

                 return temp;

        }

 }

 }

}

原文地址:https://www.cnblogs.com/haofaner/p/2295172.html