2013-10-18 80 views
0

我對這個ICollection的東西很陌生,需要一些關於如何實現IEnumerable和IEnumerator的指導。我已經檢查過微軟文檔,我想我理解那裏所說的(我認爲)。但是當我試圖在我的情況下實施它時,我有點困惑,可能需要一些澄清。在ICollection中實現IEnumerator和IEnumerable

基本上,我宣佈了一個T類,然後是另一個實施ICollection的類Ts。在Ts中,我有一本字典。

從主程序中,我想初始化這樣的類Ts: Ts ts = new Ts(){{a,b},{c,d}};

所以,我的問題是:

1)是否合法?它似乎是編譯器沒有投訴,雖然我還沒有運行測試,因爲我沒有徹底實現IEnumerable和IEnumerator,這引起了我的第二個問題

2)如何實現IEnumerable和IEnumerator?

下面是我的僞代碼來說明我的觀點。

 public class T 
     { 
      string itemName; 
      int quantity; 
      ..... 
      public T(string s, int q) 
      { 
       ..... 
      } 
     } 
     public class Ts: ICollection 
     { 
      private Dictionary<string, T> inventory= new Dictionary<string,T>(); 

      public void Add(string s, int q) 
      { 
       inventory.Add(s, new T(s,q)); 
      } 

      public IEnumerator<T> GetEnumerator() 
      { 
      // please help    
      } 

      IEnumerator IEnumerable.GetEnumerator() 
      { 
      // what is the proper GetEnumerator here 
      } 
      ... 
      implement other method in ICollection 
     } 

     extract from the main program 
     public Ts CollectionOfT = new Ts(){{"bicycle",100},{"Lawn mower",50}}; 
     ......... 
+0

你爲什麼要實現自己的ICollection?爲什麼不使用現有的內置集合之一(如List ),或者如果您想添加自定義功能,甚至可以從它們派生出來? –

+0

泛型請..它是2013 :) – nawfal

回答

4

正確實施到您的收藏轉換爲IEnumerable在明確的執行:

IEnumerator IEnumerable.GetEnumerator() { 
    return ((IEnumerable)your_collection_here).GetEnumerator(); 
} 

對於通用版本,叫GetEnumerator在您的收藏:

public IEnumerator<T> GetEnumerator() { 
    return your_collection_here.GetEnumerator(); 
} 

你必須有支持您的自定義集合的東西..例如ListArray等。在那些實現。

1

老實說,你不需要圍繞Dictionary構建你自己的集合「包裝器」,但是如果你必須的話,你幾乎可以把所有的調用委託給字典來實現ICollection接口。 希望這有助於

 public class Ts: ICollection<T> 
    { 
     private Dictionary<string, T> inventory= new Dictionary<string,T>(); 

     //public void Add(string s, int q) 
     //{ 
     // inventory.Add(s, new T(s,q)); 
     //} 
     public void Add(T item) 
     { 
      inventory.Add(item.ItemName,item); 
     } 
     public void Add(string s, int q) 
     { 
      inventory.Add(s, new T(s, q)); 
     } 

     public void Clear() 
     { 
      inventory.Clear(); 
     } 

     public bool Contains(T item) 
     { 
      return inventory.ContainsValue(item); 
     } 

     public void CopyTo(T[] array, int arrayIndex) 
     { 
      inventory.Values.CopyTo(array, arrayIndex); 
     } 

     public int Count 
     { 
      get { return inventory.Count; } 
     } 

     public bool IsReadOnly 
     { 
      get { return false; } 
     } 

     public bool Remove(T item) 
     { 
      return inventory.Remove(item.ItemName); 
     } 

     public System.Collections.Generic.IEnumerator<T> GetEnumerator() 
     { 
      return inventory.Values.GetEnumerator(); 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return inventory.Values.GetEnumerator(); 
     } 
    } 
    class Program 
    { 
     Ts ts = new Ts { { "a", 1 }, { "b", 2 } }; 
     foreach (T t in ts) 
     { 
      Console.WriteLine("{0}:{1}",t.ItemName,t.Quantity); 
     } 
    } 
+0

謝謝帕特爾。它確實有幫助。我喜歡你的答案和西蒙,但只能標記一個作爲答案。我希望我可以將兩者都標記爲答案。每個人都有自己的觀點。謝謝你們! – user1205746

相關問題