欢迎来到我的地盘:今天是

若得山花插满头,莫问奴归处!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
【摘 要】C#提供的索引指示器使我们可以方便且高效的完成对一组对象的访问。通常,我们先创建一个容器类,用于存储对象,并且通过实现枚举器接口提供相应的操作方法。

在程序开发过程中,常常需要对一组对象进行访问,通常是创建数组列表,通过操作数组的方式进行访问。

C#提供的索引指示器使我们可以方便且高效的完成对一组对象的访问。通常,我们先创建一个容器类,用于存储对象,并且通过实现枚举器接口提供相应的操作方法。以下示例程序演示了如何创建并使用索引指示器。

第一步:创建容器类

这段代码中,使用了ARRAYLIST,使我们可以利用ARRAYLIST的功能特性管理对象;另外,实现IENUMERATOR接口,提供如MOVENEXT,RESET等方法,并且使容器类可以支持FOREACH操作。

class Employees:IEnumerator //为了使容器支持(FOREACHIN)操作,必须实现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 );
  }

 }

}
posted on 2007-12-06 11:31  莫问奴归处  阅读(1046)  评论(1编辑  收藏  举报
轩轩娃