如何在C#中创建Collection类

如何在C#中创建Collection类
作者:黄海

介绍:
Collection类在.NET编程中频繁的使用着,比如说:ArrayList,NameValueCollection,HashTable都是可收集的类。其中我们看到一个很特殊的事情是它们都能在其中使用象 foreach(...)这样的循环。而且VC#和VB.NET都可以使用这样的循环。那么我们自定义的类如何实现这个功能呢?那就要求我们自定义的类中使用接口(interfaces)。要这篇文章中我们要看到如何使用C#对可收集类的编码。
例子:
 在这个例子中,我们假设我们需要一种数据结构,在这个结构当中我们要放入一些图书的标题列表。我们用这个结构要实现加入、移出。我们要建立一个可收集的类,不妨把它叫作Books,用它来存储这些标题列表。在开始我们创建可收集类之前,让我们看一下Books类的最基本的样子:
 namespace CollectionClass
{
class Books
{
 private ArrayList m_booktitles;
 public Books()
 {
  m_booktitles=new ArrayList();
 }

 public void Add(string booktitle)
 {
  m_booktitles.Add(booktitle);
 }

 public void Remove(string booktitle)
 {
  m_booktitles.Remove(booktitle);
 }
}
}


正如我们看到的,我们在ArrayList中提供了一个最简单的方法去加入和移出数据,然而我们不能在这样的结构当中使用foreach的循环,为了能做到这一点,我们还得要做到:
1、 声明Books类是一个 System.Collections.IEnumerable 接口(interface)
2、创建一个类,用于实现System.Collections.IEnumerator 的接口(interface)
IEnumerable Interface

IEnumerable interface仅仅有一个要实现的方法:GetEnumerator(),它会返回一个System.Collections.IEnumerable 的类,下边的代码可以帮我们理解这个过程:
class Books:IEnumerable
{
 public ArrayList m_booktitles;

 public Books()
 {
  m_booktitles=new ArrayList();
 }

 public void Add(string booktitle)
 {
  m_booktitles.Add(booktitle);
 }

 public void Remove(string booktitle)
 {
  m_booktitles.Remove(booktitle);
 }

 public IEnumerator GetEnumerator()
 {
  return new BooksEnumerator(this);
 }
}
这个GetEnumerator()方法返回了一个BooksEnumerator类的实例,我们在下面要继续讨论它。
IEnumerator Interface
 IEnumerator Interface接口存在于System.Collection这个命名空间中,这个接口我们要实现如下的方法和属性:
public bool MoveNext()
{
}
public void Reset()
{
}
public object Current
{
}

这个MoveNext方法告诉我们当用户想要向前滚动时我们要作什么,Reset会重新指向开始时的数据,Current 会返回当前的值.
BooksEnumerator Class
下面是一个完整的代码,展示了如何实现IEnumerator 接口:
class BooksEnumerator : IEnumerator
{
 private int position = -1;
 private Books books;

 public BooksEnumerator(Books books)
 {
  this.books = books;
 }

 public bool MoveNext()
 {
  if (position < books.m_booktitles.Count - 1)
  {
   position++;
   return true;
  }
  else
  {
   return false;
  }
 }

 public void Reset()
 {
  position = -1;
 }

 public object Current
 {
  get
  {
   return books.m_booktitles[position];
  }
 }
}
在上面的程序中,我们将我们定义的Books类放入到这个新类中来。这个类包含一个指针,指向当前的位置。

开始使用我们的Collection类!
我们可以开始使用我们的类了:
class Class1
{
static void Main(string[] args)
{
 Books b=new Books();

 b.Add("vb.net");
 b.Add("c#");
 b.Add("asp.net");

 foreach(string s in b)
 {
  Console.WriteLine(s);
 }
}
}

联系电话:13538231990  qq:10402852  Email:huanghai@bdfsz.com.cn
联系地址:广东省深圳市南山区星海名城前海路北大附中南山分校信息中心  黄海收   邮编 :518052

posted on 2005-10-08 21:06  扎悉的乐  阅读(558)  评论(0)    收藏  举报

导航