0

私はこの ICollection に非常に慣れていないので、IEnumerable と IEnumerator を実装する方法についてのガイダンスが必要です。Microsoft のドキュメントを確認しましたが、そこに書かれていることは理解できたと思います (と思います)。しかし、私のケースでそれを実装しようとしたとき、少し混乱したので、明確にする必要があるかもしれません.

基本的に、クラス T を宣言し、次に ICollection を実装する別のクラス Ts を宣言しました。Tsでは辞書を持っています。

メイン プログラムから、クラス Ts を次のように初期化します。 Ts ts= new Ts(){{a,b}, {c,d}};

だから、私の質問は次のとおりです。

1)それを行うことは合法ですか?IEnumerable と IEnumerator を完全に実装していないため、テストを実行していませんが、コンパイラが文句を言わなかったようです。これが 2 番目の質問につながりました

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}};
        .........
4

2 に答える 2

2

正直なところ、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);
        }
    }
于 2013-10-18T05:47:47.367 に答える