在C#中创建自己的集合类

       集合类在.NET应用得很广泛,比如 ArrayList类,HashTable类等。这些集合类特有的一个特征就是可以用 foreach 循环遍历集合中的每一个元素。通过实现某个特定的接口,我们也可以创建自己的集合类。下面用C#说明。

        在我们的例子中,将创建一个 Books类,用来存储一些书名的集合。我们可以添加、移除或遍历集合中的元素(即书名)。为了达到利用 foreach循环遍历集合的目的,我们必须实现下面两点:
1。在 Books类中实现 System.Collections.IEnumerable接口
2。创建一个实现 System.Collections.IEnumerator接口的类

IEnumerable接口

IEnumerable接口只有一个方法:GetEnumerator(),该方法返回一个实现了IEnumerator的类。下面就是实现了IEnumerable接口的Books类的代码:
namespace CollectionClassDemo
{
    
public class Books:IEnumerable
    
{
        
public ArrayList bookTitles; //这里一定要用public,否则会出错
        public Books()
        
{
            bookTitles 
= new ArrayList();
        }

        
public void Add(string bookTitle)
        
{
            bookTitles.Add(bookTitle);
        }

        
public void Remove(string bookTitle)
        
{
            bookTitles.Remove(bookTitle);
        }

        
public IEnumerator GetEnumerator()
        
{
            
return new BooksEnumerator(this);
        }

    }

}

IEnumerator接口

        IEnumerator接口位于System.Collections名称空间下。我们必须实现该接口如下的方法和属性定义:

public bool MoveNext()
{
}

public void Reset()
{
}

public object Current
{
}

        其中MoveNext()使游标移向下一个元素,直到最后一个元素。Reset()初始化集合,可以在这里设游标的值为-1。Current属性取回当前集合的元素。

下面就是实现了IEnumerator接口的类BooksEnumerator的代码:

namespace CollectionClassDemo
{
    
public class BooksEnumerator:IEnumerator
    
{
        
private int position = -1;
        
private Books books;

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

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

            
else
            
{
                
return false;
            }

        }

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


        
public object Current
        
{
            
get
            
{
                
return books.bookTitles[position];
            }

        }

    }

    
}

        通过传递一个Books对象给BooksEnumerator类的构造函数,BooksEnumerator类就维护一个指针指向集合的当前位置。

下面我们就可以使用这个Books集合类了:

namespace CollectionClassDemo
{
    
class Class1
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            Books b 
= new Books();
            b.Add(
"ASP.NET");
            b.Add(
"C#");
            b.Add(
"Visual C++");
            b.Remove(
"C#");
            
foreach(string i in b)
            
{
                Console.WriteLine(i);
            }

            Console.Read();
        }

    }

}

Reference:http://www.dotnetbips.com/EEB3F756-B4B5-4863-8B6F-18D2EC6D37CE.aspx?articleid=65

posted @ 2005-12-03 15:17  torome  阅读(1305)  评论(0)    收藏  举报