C#語法學習(索引器[indexer])

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/8/27
 * Time: 下午 09:44
 * 索引器(indexer)[也被稱為有參屬性]
 * 索引器允許類或結構的實例按照與數組相同的方式進行索引.
 * 索引器類似於屬性,不同之處在於它們的訪問器采用參數.
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
class  ArrClass // 沒有索引用器的類
 {
     
private   readonly   string  name;
     
public  ArrClass( string  name)
     {
         
this .name = name;
     }
     
public   string  Name
     {
         
get { return  name;}
     }
 }

 
class  Test
 {
     
static   void  Main()
     {
         
// 數組類的使用
         ArrClass[] a = new  ArrClass[ 10 ];
         a[
0 ] = new  ArrClass( " 張三 " );
         a[
1 ] = new  ArrClass( " 李四 " );
         a[
2 ] = new  ArrClass( " 王五 " );
         Console.WriteLine(
" a[0]= "   +  a[ 0 ].Name);
         Console.WriteLine(
" a[1]= "   +  a[ 1 ].Name);
         Console.WriteLine(
" a[2]= "   +  a[ 2 ].Name);
     }
 }
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/8/27
 * Time: 下午 09:44
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
class  ArrClass // 沒有索引用器的類
 {
     
private   readonly   string  name;
     
public  ArrClass( string  name)
     {
         
this .name = name;
     }
     
public   string  Name
     {
         
get { return  name;}
     }
 }
class  IndexClass // 帶索引器的類,把數組封裝到類里的一种方法
{
    
private   string [] name = new   string [ 10 ];
    
public   string   this [ int  index] // 定議索引器,索引器的索引值不一定為整數,還可以是其它類型
    {
        
get
        {
            
return  name[index];
        }
        
set
        {
            name[index]
= value;
        }
    }
}
 
class  Test
 {
     
static   void  Main()
     {
         
// 數組類的使用
         ArrClass[] a = new  ArrClass[ 10 ];
         a[
0 ] = new  ArrClass( " 張三 " );
         a[
1 ] = new  ArrClass( " 李四 " );
         a[
2 ] = new  ArrClass( " 王五 " );
         Console.WriteLine(
" a[0]= "   +  a[ 0 ].Name);
         Console.WriteLine(
" a[1]= "   +  a[ 1 ].Name);
         Console.WriteLine(
" a[2]= "   +  a[ 2 ].Name);
         
// 索引器的使用
         IndexClass b = new  IndexClass();
         b[
0 ] = " 張三 " ;
         b[
1 ] = " 李四 " ;
         b[
2 ] = " 王五 " ;
         Console.WriteLine(
" b[0]= "   +  b[ 0 ]);
         Console.WriteLine(
" b[1]= "   +  b[ 1 ]);
         Console.WriteLine(
" b[2]= "   +  b[ 2 ]);
     }
 }
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/8/27
 * Time: 下午 09:44
 * 定議索引器,索引器的索引值不一定為整數,還可以是其它類型
 * Hashtable
 * 在.net framework中,hashtable是system.collections命名空間提供的一個容器
 * 用於處理和表現類似key/value的鍵值對.
 * 其中key通常可以用來快速查找,同時key是區分大小寫;
 * value用於存儲對應於key的值.
 * hashtable中key/value鍵值對均為object類型,所以hashtable可以支持任何類型的
 * key/value鍵值對.
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
using  System.Collections;
class  IndexClass // 帶索引器的類,把數組封裝到類里的一种方法
{
    
private  Hashtable name = new  Hashtable();
    
public   string   this [ string  index] // 定議索引器,索引器的索引值不一定為整數,還可以是其它類型
    {
        
get
        {
            
// 因為hashtable返回的是一個object類型需要轉換成string;
             return  name[index].ToString();
        }
        
set
        {
            
// 給hashtable賦值時是key,value的鍵值對的形式
            name.Add(index,value);
        }
    }
}
 
class  Test
 {
     
static   void  Main()
     {

         
// 索引器的使用
         IndexClass b = new  IndexClass();
         b[
" A001 " ] = " 張三 " ;
         b[
" A002 " ] = " 李四 " ;
         b[
" A003 " ] = " 王五 " ;
         Console.WriteLine(
" b[A001]= "   +  b[ " A001 " ]);
         Console.WriteLine(
" b[A002]= "   +  b[ " A002 " ]);
         Console.WriteLine(
" b[A003]= "   +  b[ " A003 " ]);
     }
 }
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/8/27
 * Time: 下午 09:44
 * 索引器可以被重載
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
 
using  System;
 
using  System.Collections;
class  IndexClass // 帶索引器的類,把數組封裝到類里的一种方法
{
    
private  Hashtable name = new  Hashtable();
    
public   string   this [ int  index] // 定議索引器,索引器的索引值不一定為整數,還可以是其它類型 // A索引器
    {
        
get
        {
            
// 因為hashtable返回的是一個object類型需要轉換成string;
             return  name[index].ToString();
        }
        
set
        {
            
// 給hashtable賦值時是key,value的鍵值對的形式
            name.Add(index,value);
        }
    }
    
public   int   this [ string  aName] // B索引器
    {
        
get
        {
            
foreach (DictionaryEntry d  in  name)
            {
                
if (d.Value.ToString() == aName)
                {
                    
return  Convert.ToInt32(d.Key);
                }
            }
            
return   - 1 ;
        }
        
set {name.Add(value,aName);}
    }
}
 
class  Test
 {
     
static   void  Main()
     {

         
// 索引器的使用
         IndexClass b = new  IndexClass();
         
// 調用A索引器
         b[ 100 ] = " 張三 " ;
         b[
200 ] = " 李四 " ;
         b[
300 ] = " 王五 " ;
         Console.WriteLine(
" 編號為100的員工是: "   +  b[ 100 ]);
         Console.WriteLine(
" 編號為200的員工是: "   +  b[ 200 ]);
         Console.WriteLine(
" 編號為300的員工是: "   +  b[ 300 ]);
         
// 調用B索引器
         Console.WriteLine( " 張三的編號是: "   +  b[ " 張三 " ]);
         Console.WriteLine(
" 李四的編號是: "   +  b[ " 李四 " ]);
         Console.WriteLine(
" 王五的編號是: "   +  b[ " 王五 " ]);
         b[
" 馬六 " ] = 400 ;
         b[
" 錢七 " ] = 500 ;
         
// 調用A索引器
         Console.WriteLine( " 編號為400的員工是: "   +  b[ 400 ]);
         Console.WriteLine(
" 編號為500的員工是: "   +  b[ 500 ]);         
         
// Console.WriteLine("馬六的編號是:" + b["馬六"]);
         
// Console.WriteLine("錢七的編號是:" + b["錢七"]);
     }
 }
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2008/8/27
 * Time: 下午 10:23
 * 索引器與數組的比較
 * 1,索引器的索引值(Index)類型不受限為整數
 * 用來訪問數組的索引值(index),其類型一定為整數,然後索引器可以定議其他類型的索引值.
 * 2,索引器允許重載(Overloading)
 * 一個類並不限制只能夠定議一下索引器,只要索引器的函數簽名不同,一個類就可以擁有很多個索引器,你可以重載它的功能.
 * 3,索引器不是一個變量
 * 索引和數組不同的地方在於,索引器並沒有直接對應應用數據存儲的地方,而數組則有.
 * 索引器有get訪問器與set訪問器,用來指明要讀取或是寫入索引器元素時,需要執行的代碼.
 * 
 * 
 * 索引器與屬性的不同點
 * 1,標識方式:屬性以名稱來標識;索引器則以函數簽名來票識.
 * 2,索引器可以被重載:因為屬性是以名稱來標識的,所以不能被重載;索引器是以函數簽名來標識的,因此可以重載.
 * 3,索引器不可以聲明為static:屬性可以為static,而索引器永遠屬於實例成員,不能為static.
 * 
 * 
 * 索引器可以用多個參數來訪問
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 
*/
using  System;
using  System.Windows.Forms;
using  System.Collections;
// 姓名,課程id,成績
class  CourseScore // 課程的分數類
{
    
private   string  name;
    
private   int  courseID;
    
private   int  score;
    
public  CourseScore( 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  CourseScoreIndexer // 索引器用於存取和查詢CourseScore類
{

    
private  ArrayList arrCourseScore;
    
public  CourseScoreIndexer()
    {
        arrCourseScore
= new  ArrayList();
    }
    
public   int   this [ string  name, int  courseID]
    {
        
get
        {
            
foreach (CourseScore cs  in  arrCourseScore)
            {
                
if (cs.Name == name  &&  cs.CourseID == courseID)
                {
                    
return  cs.Score;
                }
            }
            
return   - 1 ;
        }
        
set
        {
            arrCourseScore.Add(
new  CourseScore(name,courseID,value)); // arr["張三",1]=90
        }
    }
    
public  ArrayList  this [ string  name]
    {
        
get
        {
            ArrayList tempArr
= new  ArrayList();
            
foreach (CourseScore cs  in  arrCourseScore)
            {
                
if (cs.Name == name)
                {
                    tempArr.Add(cs);
                }
            }
            
return  tempArr;
        }
    }
}
class  Test
{
    
static   void  Main()
    {
        CourseScoreIndexer csi
= new  CourseScoreIndexer();
        csi[
" 張三 " , 1 ] = 90 ;
        csi[
" 張三 " , 2 ] = 85 ;
        csi[
" 張三 " , 3 ] = 80 ;
        csi[
" 李四 " , 1 ] = 70 ;
        Console.WriteLine(csi[
" 張三 " , 2 ]);
        Console.WriteLine(
" 返回張三的所有成績 " );
        ArrayList tempArr;
        tempArr
= csi[ " 張三 " ];
        
foreach (CourseScore cs  in  tempArr)
        {
            Console.WriteLine(
" 姓名: "   +  cs.Name  +   "  課程編號: "   +  cs.CourseID  +   "  分數: "   +  cs.Score);
        }
    }
}

你可能感兴趣的:(index)