冠冕堂皇

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

在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 on 2013-08-01 14:18  冠冕堂皇  阅读(585)  评论(0)    收藏  举报