【摘 要】C#提供的索引指示器使我们可以方便且高效的完成对一组对象的访问。通常,我们先创建一个容器类,用于存储对象,并且通过实现枚举器接口提供相应的操作方法。
 class Employees:IEnumerator //为了使容器支持(FOREACH
class Employees:IEnumerator //为了使容器支持(FOREACH IN
IN )操作,必须实现IENUMERATOR接口)
)操作,必须实现IENUMERATOR接口)
 {
{
 private ArrayList m_Employees;  //定义一个ARRAYLIST对象
 private ArrayList m_Employees;  //定义一个ARRAYLIST对象
 private int m_MaxEmployees;  //定义容器可接受的最大对象数量
 private int m_MaxEmployees;  //定义容器可接受的最大对象数量

 //构造器,创建ARRAYLIST对象,并且定义可接受的最大对象数量
 //构造器,创建ARRAYLIST对象,并且定义可接受的最大对象数量
 public Employees(int MaxEmployees)
 public Employees(int MaxEmployees)
 {
 {
 m_MaxEmployees = MaxEmployees;
  m_MaxEmployees = MaxEmployees;
 m_Employees = new  ArrayList(MaxEmployees);
  m_Employees = new  ArrayList(MaxEmployees);
 }
 }
 //按照索引ID创建索引指示器
 //按照索引ID创建索引指示器
 public Employee this[int index]
 public Employee this[int index]
 {
 {
 get
  get
 {
  {
 if (index < 0 || index > m_Employees.Count -1)
   if (index < 0 || index > m_Employees.Count -1)
 {
   {
 return null;
    return null;
 }
   }
 return (Employee) m_Employees[index];
   return (Employee) m_Employees[index]; 
 }
  }
 set
  set
 {
  {
 if (index <0 || index > m_MaxEmployees-1)
   if (index <0 || index > m_MaxEmployees-1)
 {
   {
 return ;
    return ;
 }
   }
 m_Employees.Insert(index,value);
   m_Employees.Insert(index,value);
 }
  }
 }
 }
 //自定义索引指示器
 //自定义索引指示器
 public Employee this[string SSN]
 public Employee this[string SSN]
 {
 {
 get
  get
 {
  {
 Employee empReturned = null;
   Employee empReturned = null;
 foreach (Employee employee in m_Employees)
   foreach (Employee employee in m_Employees)
 {
   {
 if (employee.SSN == SSN)
    if (employee.SSN == SSN)
 {
    {
 empReturned = employee;
     empReturned = employee;
 break;
     break;
 }
    }
 }
   }
 return empReturned;
   return empReturned; 
 }
  }
 }
 }
 //提供容器内对象数量
 //提供容器内对象数量
 public int Length
 public int Length
 {
 {
 get
  get
 {
  {
 return m_Employees.Count;
   return m_Employees.Count;
 }
  }
 }
 }

 //实现IENUMERATOR接口
 //实现IENUMERATOR接口
 public IEnumerator GetEnumerator()
 public IEnumerator GetEnumerator()
 {
 {
 return m_Employees.GetEnumerator();
  return m_Employees.GetEnumerator();
 }
 }
 public bool MoveNext(){return m_Employees.GetEnumerator().MoveNext();}
 public bool MoveNext(){return m_Employees.GetEnumerator().MoveNext();}
 public void Reset(){m_Employees.GetEnumerator().Reset();}
 public void Reset(){m_Employees.GetEnumerator().Reset();}
 public object Current
 public object Current
 {
 {
 get
  get
 {
  {
 return m_Employees.GetEnumerator().Current;
   return m_Employees.GetEnumerator().Current;   
 }
  }
 }
 }
 }
}
 //构建对象
//构建对象
 class Employee
class Employee
 {
{
 private string m_firstname;
 private string m_firstname;
 private string m_middlename;
 private string m_middlename;
 private string m_lastname;
 private string m_lastname;
 private string m_SSN;
 private string m_SSN;

 //构造器,当实例化对象时对属性成员赋值
 //构造器,当实例化对象时对属性成员赋值
 public Employee(string FirstName,string MiddleName,string LastName,string SSN)
 public Employee(string FirstName,string MiddleName,string LastName,string SSN)
 {
 {
 m_firstname = FirstName;
  m_firstname = FirstName;
 m_middlename = MiddleName;
  m_middlename = MiddleName;
 m_lastname = LastName;
  m_lastname = LastName;
 m_SSN = SSN;
  m_SSN = SSN;
 }
 }

 public string FirstName
 public string FirstName
 {
 {
 get {return m_firstname;}
  get {return m_firstname;}
 set {m_firstname = value;}
  set {m_firstname = value;}
 }
 } 
 public string LastName
 public string LastName
 {
 {
 get{return m_lastname;}
  get{return m_lastname;}
 set{m_lastname = value;}
  set{m_lastname = value;}
 }
 }
 public string MiddleName
 public string MiddleName
 {
 {
 get{return m_middlename;}
  get{return m_middlename;}
 set{m_middlename = value;}
  set{m_middlename = value;} 
 }
 }
 public string SSN
 public string SSN
 {
 {
 get{return m_SSN;}
  get{return m_SSN;}
 set{m_SSN = value;}
  set{m_SSN = value;}
 }
 }
 }
}
 class IndexerSample
class IndexerSample
 {
{
 static void Main(string[] args)
 static void Main(string[] args)
 {
 {
 try
  try
 {
  {
 //创建容器类对象
   //创建容器类对象
 Employees employees = new Employees(4);
   Employees employees = new Employees(4);
 
   
 string ssn = "";
   string ssn = "";

 //将实例化的EMPLOYEE对象加入到容器类对象EMPLOYEES中
   //将实例化的EMPLOYEE对象加入到容器类对象EMPLOYEES中
 employees[0] = new Employee("Timothy","Arthur","Tucker","555-555-555");
   employees[0] = new Employee("Timothy","Arthur","Tucker","555-555-555");
 employees[1] = new Employee("Jackie","zxh","Cheung","555-555-552");
   employees[1] = new Employee("Jackie","zxh","Cheung","555-555-552");
 employees[2] = new Employee("John","JHK","Kong","555-555-553");
   employees[2] = new Employee("John","JHK","Kong","555-555-553");
 employees[3] = new Employee("Ken","KNC","Chang","555-555-551");
   employees[3] = new Employee("Ken","KNC","Chang","555-555-551");
 
   
 if (args.Length > 0)
    if (args.Length > 0)
 {
    {
 foreach(string s in args)
     foreach(string s in args)
 {
     {
 ssn = ssn + s;
      ssn = ssn + s;
 }
     }

 //根据自定义的索引关键字SSN查找对象
   //根据自定义的索引关键字SSN查找对象
 Employee employee = employees[ ssn.ToString() ];
   Employee employee = employees[ ssn.ToString() ];
 if (employee !=null )
   if (employee !=null )
 {
   {
 string name = employee.FirstName + " " + employee.LastName;
    string name = employee.FirstName + " " + employee.LastName;
 
    
 Console.WriteLine("Name: {0},SSN:{1}", name,ssn);
    Console.WriteLine("Name: {0},SSN:{1}", name,ssn); 
 }
   }
 else
   else
 {
   {
 Console.WriteLine("Can Not find the record !");
    Console.WriteLine("Can Not find the record !");
 }
   }
 }
    }
 else
    else
 { //显示容器中所有的对象信息
    { //显示容器中所有的对象信息
 for (int i = 0 ; i < employees.Length; i++)
   for (int i = 0 ; i < employees.Length; i++)
 {
   {
 string name = employees[i].FirstName + " " +
    string name = employees[i].FirstName + " " + 
 employees[i].MiddleName + " " +
     employees[i].MiddleName + " " +
 employees[i].LastName;
     employees[i].LastName;

 ssn = employees[i].SSN;
    ssn = employees[i].SSN;

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

 
        
 
  
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号