C#之索引器

什么是索引器

索引器允許類或者結(jié)構(gòu)的實例按照與數(shù)組相同的方式進行索引。索引器類似于屬性,不同之處在于他們的訪問采用參數(shù)。

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

        //索引器必須以this關(guān)鍵字定義,其實這個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();
            //“=”號右邊對索引器賦值,其實就是調(diào)用其set方法
            indexer[0] = "張三";
            indexer[1] = "李四";
            //輸出索引器的值,其實就是調(diào)用其get方法
            Console.WriteLine(indexer[0]);
            Console.WriteLine(indexer[1]);
            Console.ReadKey();
        }
    }

索引器與數(shù)組的區(qū)別:

索引器的索引值(Index)類型不限定為整數(shù):
用來訪問數(shù)組的索引值(Index)一定為整數(shù),而索引器的索引值類型可以定義為其他類型。

索引器允許重載
一個類不限定為只能定義一個索引器,只要索引器的函數(shù)簽名不同,就可以定義多個索引器,可以重載它的功能。

索引器不是一個變量
索引器沒有直接定義數(shù)據(jù)存儲的地方,而數(shù)組有。索引器具有Get和Set訪問器。

索引器與屬性的區(qū)別:

索引器以函數(shù)簽名方式 this 來標(biāo)識,而屬性采用名稱來標(biāo)識,名稱可以任意
索引器可以重載,而屬性不能重載。
索引器不能用static 來進行聲明,而屬性可以。索引器永遠屬于實例成員,因此不能聲明為static。

以字符串作為下標(biāo),對索引器進行存?。?/strong>

    //以字符串為下標(biāo)的索引器
    public class IDXer2
    {
        private Hashtable name = new Hashtable();

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

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

多參數(shù)索引器及索引器的重載

    /// <summary>
    /// 成績類
    /// </summary>
    public class Scores
    {
        /// <summary>
        /// 學(xué)生姓名
        /// </summary>
        public string StuName { get; set; }

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

        /// <summary>
        /// 分數(shù)
        /// </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 });
            }
        }

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

   static void Main(string[] args)
   {
       //多參數(shù)索引器和索引器重載          
       FindScore fScore = new FindScore();
       fScore["張三", 1] = 98;
       fScore["張三", 2] = 100;
       fScore["張三", 3] = 95;
       fScore["李四", 1] = 96;
       //查找 張三 課程編號2 的成績
       Console.WriteLine("李四 課程編號2 成績?yōu)?" + fScore["李四", 1]);
       //查找所有張三的成績
       List<Scores> listScores = fScore["張三"];
       if (listScores.Count > 0)
       {
          foreach (Scores s in listScores)
          {
             Console.WriteLine(string.Format("張三 課程編號{0} 成績?yōu)?{1}", s.CourseId, s.Score));
          }
       }
       else
       {
           Console.WriteLine("無該學(xué)生成績單");
       }
       Console.ReadKey();
   }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,172評論 2 9
  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計...
    子非魚_t_閱讀 4,619評論 1 44
  • 讀書伴我 成長 高萬祥老師的一本書《優(yōu)秀教師的九堂必修課》,其中第一堂便是:讀書修...
    堅持讓寫作成為習(xí)慣閱讀 288評論 0 1
  • 你的出生就決定了你能力的上限 決定了你的智力上限、武力上限、感性上限、理性上限等 你的智力加爆,也不能加到上限以上...
    你飛躍俊杰閱讀 284評論 0 0
  • 越來越覺得周總結(jié)的重要性,瞬間這一周又過去了,仔細翻看微博和筆記本才記得這周的所行所事。 這一周看的電影比較多。 ...
    DL諾爾閱讀 214評論 0 1

友情鏈接更多精彩內(nèi)容