日期:
2008-6-14
学习内容:索引器
遗留问题:
学习总结:
1.
索引器
索引器(
indexer
):索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似与属性,不同之处在于它们的访问器采用参数。
数组类的使用实例:
using
System;//
引用System命名空间
class
Arrclass
{
private readonly string name;
public Arrclass(string name)//Arrclass
的构造函数,并且带有参数name
{
this.name = name;
}
public string Name //
定义一个只读访问器Name
{
get
{
return name;
}
}
}
class
Test
{
static void Main ()
{
Arrclass[] a=new Arrclass[10];//
定义一个存储Arrclass类实例的数组,并且指定长度为个元素
a[0]=new Arrclass("
张三"
);//
利用数组下标索引,给数组赋值
a[1]=new Arrclass("
李四"
);
a[2]=new Arrclass("
王五"
);
Console.WriteLine("a[0]="+a[0].Name);//
输出Arrclass类实例的数组中元素的值
Console.WriteLine("a[1]="+a[1].Name);
Console.WriteLine("a[2]="+a[2].Name);
}
}
索引器的使用实例:
using
System;//
引用System命名空间
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 ()
{
Indexclass b = new Indexclass();//
声明一个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]);
}
}
索引器除了索引值为整型外,还可以为其他类型,用其他类型的索引值,需要用到HashTable 类
在.net framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。、
索引值为字符串型的实例:
using
System;//
引用System命名空间
using
System.Collections;//
引用此命名空间,因为Hashtable类包含在其中
class
Indexclass
{
private Hashtable name = new Hashtable();//
声明一个Hashtable类的实例并把他作为Indexclass类的成员
public string this[string index]//
定义索引器,它有点像属性,只不过是带参数,并且索引值为字符串型
{
get
{
return name[index].ToString();//
因为Hashtable类的键值返回的是object类型,需要把他转换成字符串型
}
set
{
name.Add(index, value);//
向Hashtable中写入值需要用它本身的add方法
}
}
}
class
Test
{
static void Main ()
{
Indexclass b = new Indexclass();//
声明一个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"]);
}
}
还有一个知识点需要说明:索引器可以重载,下面通过一个实例说明重载。本例的功能是可以通过学号查找学生姓名,或者姓名查找学生学号
using
System;//
引用System命名空间
using
System.Collections;//
引用此命名空间,因为Hashtable类包含在其中
class
Indexclass
{
private Hashtable name = new Hashtable();//
声明一个Hashtable类的实例并把他作为Indexclass类的成员
public string this[int index]//
定义索引器,它有点像属性,只不过是带参数,并且索引值为字符串型
{
get
{
return name[index].ToString();//
因为Hashtable类的键值返回的是object类型,需要把他转换成字符串型
}
set
{
name.Add(index, value);//
向Hashtable中写入值需要用它本身的add方法
}
}
public int this[string aName]//
定义索引器,和上一个索引器构成重载
{
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();//
声明一个Indexclass类的实例
//
调用A索引器
b[100] = "
张三"
;//
为实例赋值
b[200] = "
李四"
;
b[300] = "
王五"
;
Console.WriteLine("
编号为100的员工是:"
+ b[100]);
Console.WriteLine("
编号为200的员工是:"
+ b[200]);
Console.WriteLine("
编号为300的员工是:"
+ b[300]);
Console.WriteLine();
//
调用B索引器
Console.WriteLine("
张三的编号是:"
+ b["
张三"
]);
Console.WriteLine("
李四的编号是:"
+ b["
李四"
]);
Console.WriteLine("
王五的编号是:"
+ b["
王五"
]);
//
调用A索引器,实际开发中并不会这样用
b["
赵六"
] = 400;
b["
钱七"
] = 500;
Console.WriteLine();
Console.WriteLine("
编号为400的员工是:"
+ b[400]);
Console.WriteLine("
编号为500的员工是:"
+ b[500]);
}
}
索引器和数组的比较:
1.
索引器的索引值(index)类型不受限为整数;用来访问数组的索引值(index),其类型一定为整数,然而索引器可以定义其他类型的索引值。
2.
索引器允许重载(overloading)
3.
索引器不是一个变量;索引和数组的不同地方在于,索引器并没有直接对应应用数据存储地方,而数组则有。索引器有get访问器和set访问器,用来知名要读取或写入索引元素时,需要执行的代码。
索引器与属性的不同点:
1.
标识方式:属性以名称来标识;索引器则以函数签名来标识。
2.
索引器可以被重载:因为属性是以名称标识的,所以不能被重载;索引器是用函数签名标识的,因此可以重载。
3.
索引器不可以声明为static:属性可以为static,而索引器永远属于实例成员,不能为static.
带有多参数的索引器的使用范例:
using
System;
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;
}
}
}
//
定义一个CourseScoreIndexer类的索引器
class
CourseScoreIndexer
{
private ArrayList arrCourseScore;//
声明一个ArrayList类的对象
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));
}
}
}
class
Test
{
static void Main ()
{
CourseScoreIndexer csi = new CourseScoreIndexer();
csi["
张三"
, 2] = 90;
csi["
李四"
, 1] = 80;
csi["
张三"
, 1] = 85;
csi["
李四"
, 2] = 75;
Console.WriteLine(csi["
张三"
, 2]);
}
}
如何实现把张三的全部成绩打印出来呢?索引器重载
using
System;
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;
}
}
}
//
定义一个CourseScoreIndexer类的索引器,用以存储和查询CourseScore类
class
CourseScoreIndexer
{
private ArrayList arrCourseScore;//
声明一个ArrayList类的对象
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));
}
}
public ArrayList this[string name]
{
get
{
ArrayList tmparr = new ArrayList();
foreach (CourseScore cs in arrCourseScore)
{
if (cs.Name == name)
tmparr.Add(cs);
}
return tmparr;
}
}
}
class
Test
{
static void Main ()
{
CourseScoreIndexer csi = new CourseScoreIndexer();
csi["
张三"
, 2] = 90;
csi["
李四"
, 1] = 80;
csi["
张三"
, 1] = 85;
csi["
李四"
, 2] = 75;
Console.WriteLine(csi["
张三"
, 2]);
Console.WriteLine("
张三的所有课程成绩为:"
);
ArrayList arrtemp;
arrtemp=csi["
张三"
];
foreach (CourseScore cs in arrtemp)
Console.WriteLine("
姓名为:"
+ cs.Name + "
课程号:"
+ cs.CourseID + "
成绩:"
+ cs.Score);
}
}