【摘 要】
在程序开发过程中,常常需要对一组对象进行访问,通常是创建数组列表,通过操作数组的方式进行访问。
C#提供的索引指示器使我们可以方便且高效的完成对一组对象的访问。通常,我们先创建一个容器类,用于存储对象,并且通过实现枚举器接口提供相应的操作方法。以下示例程序演示了如何创建并使用索引指示器。
第一步:创建容器类
这段代码中,使用了ARRAYLIST,使我们可以利用ARRAYLIST的功能特性管理对象;另外,实现IENUMERATOR接口,提供如MOVENEXT,RESET等方法,并且使容器类可以支持FOREACH操作。
class Employees:IEnumerator //为了使容器支持(FOREACH...IN...)操作,必须实现IENUMERATOR接口) { private ArrayList m_Employees; //定义一个ARRAYLIST对象 private int m_MaxEmployees; //定义容器可接受的最大对象数量
//构造器,创建ARRAYLIST对象,并且定义可接受的最大对象数量 public Employees(int MaxEmployees) { m_MaxEmployees = MaxEmployees; m_Employees = new ArrayList(MaxEmployees); } //按照索引ID创建索引指示器 public Employee this[int index] { get { if (index < 0 || index > m_Employees.Count -1) { return null; } return (Employee) m_Employees[index]; } set { if (index <0 || index > m_MaxEmployees-1) { return ; }
m_Employees.Insert(index,value); } } //自定义索引指示器 public Employee this[string SSN] { get { Employee empReturned = null; foreach (Employee employee in m_Employees) { if (employee.SSN == SSN) { empReturned = employee; break; } } return empReturned; }
} //提供容器内对象数量 public int Length { get { return m_Employees.Count; } }
//实现IENUMERATOR接口 public IEnumerator GetEnumerator() { return m_Employees.GetEnumerator(); } public bool MoveNext(){return m_Employees.GetEnumerator().MoveNext();} public void Reset(){m_Employees.GetEnumerator().Reset();} public object Current { get { return m_Employees.GetEnumerator().Current; } } }
第二步:构建对象
以下代码实现了一个类Employee
//构建对象 class Employee { private string m_firstname; private string m_middlename; private string m_lastname; private string m_SSN;
//构造器,当实例化对象时对属性成员赋值 public Employee(string FirstName,string MiddleName,string LastName,string SSN) { m_firstname = FirstName; m_middlename = MiddleName; m_lastname = LastName; m_SSN = SSN; }
public string FirstName { get {return m_firstname;} set {m_firstname = value;} } public string LastName { get{return m_lastname;} set{m_lastname = value;} } public string MiddleName { get{return m_middlename;} set{m_middlename = value;} } public string SSN { get{return m_SSN;} set{m_SSN = value;} } }
第三步:使用索引指示器
创建一个程序,对Employee实例化,并且将对象加入到容器类(Employees)中;程序判断是否有控制台参数输入,如果有, 将根据参数查询容器中的对象,否则显示容器中所有的对象信息。
class IndexerSample { static void Main(string[] args) { try { //创建容器类对象 Employees employees = new Employees(4); string ssn = "";
//将实例化的EMPLOYEE对象加入到容器类对象EMPLOYEES中
employees[0] = new Employee("Timothy","Arthur","Tucker","555-555-555"); employees[1] = new Employee("Jackie","zxh","Cheung","555-555-552"); employees[2] = new Employee("John","JHK","Kong","555-555-553"); employees[3] = new Employee("Ken","KNC","Chang","555-555-551"); if (args.Length > 0) { foreach(string s in args) { ssn = ssn + s; }
//根据自定义的索引关键字SSN查找对象
Employee employee = employees[ ssn.ToString() ]; if (employee !=null ) { string name = employee.FirstName + " " + employee.LastName; Console.WriteLine("Name: {0},SSN:{1}", name,ssn); } else { Console.WriteLine("Can Not find the record !"); } } else { //显示容器中所有的对象信息 for (int i = 0 ; i < employees.Length; i++) { string name = employees[i].FirstName + " " + employees[i].MiddleName + " " + employees[i].LastName;
ssn = employees[i].SSN;
Console.WriteLine("Name: {0},SSN:{1}", name,ssn); } } } catch (Exception e) { Console.WriteLine (e.Message ); } }
}
|