C# 常用接口學習 ICollection


C# 常用接口學習 ICollection<T>

作者:烏龍哈里
時間:2015-11-01
平台:Window7 64bit,Visual Studio Community 2015

參考:

章節:

  • 接口 ICollection<T> 實現

正文:

我們先來看看 ICollection<T>的源代碼:

public interface ICollection<T> : IEnumerable<T>
{
    int Count { get; }
    bool IsReadOnly { get; }

    void Add(T item);
    void Clear();
    bool Contains(T item);
    void CopyTo(T[] array, int arrayIndex);
    bool Remove(T item);
}

 


看着這些接口方法,覺得 ICollection<T> 接口比 IEnumerable<T> 多了好多東西,如果我們只是要簡單的 foreach,只要實現 IEnumerable<T>接口就夠了。但如果我們還要了解元素的數量、增加刪除元素等,那只好實現ICollection<T> 接口了。

 

   class Fruit
    {
        public string Name;
        public int Price;
    }

 


假設我們有個 Box 類是上面這個 Fruit 類的集合,首先我們要在 Box 類中放一個 List<T> 容器來放置元素,然后再在 Box 類上實現 ICollection<T> 接口。

    class Box : ICollection<Fruit>
    {
        public List<Fruit> _fruit = new List<Fruit>();
         public int Count
        {
            get {return _fruit.Count();}
        }
        public bool IsReadOnly
        {
            get {return false;}
        }
        public void Add(Fruit item)
        {
            _fruit.Add(item);
        }

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

        public bool Contains(Fruit item)
        {
            return _fruit.Contains(item);
        }

        public void CopyTo(Fruit[] array, int arrayIndex)
        {
            _fruit.CopyTo(array,arrayIndex);
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            foreach(var f in _fruit) yield return f;
        }

        public IEnumerator<Fruit> GetEnumerator()
        {
            foreach (var f in _fruit) yield return f;
        }

        public bool Remove(Fruit item)
        {
            return _fruit.Remove(item);
        }
    }

 


一大坨方法要讓我們填空。其實我感覺都是在 List<T> 上套了一個包裝,實質上的實現都是要靠 List<T>。 (這里真的要感謝偉大的 Visual Studio IDE 幫我們羅列了那么多接口的填空,要不然真的會遺漏的。)。把空填完后,把所有方法都加個 public ,一個新鮮熱辣的符合 ICollection<T> 約定的類就出爐了。下來我們調用:

 

static void Main(string[] args)
{
   Box box = new Box();
   box.Add(new Fruit { Name = "apple", Price = 14 });
   box.Add(new Fruit { Name = "orange", Price = 18 });
   box.Add(new Fruit { Name = "grape", Price = 30 });
   box.Add(new Fruit { Name = "banana", Price = 20});
   foreach (var b in box) Console.WriteLine($"{b.Name} {b.Price }");

   Console.WriteLine($"元素個數:{box.Count}");

   Fruit fruit = new Fruit { Name="meloon",Price=19};
   box.Add(fruit);

   Console.WriteLine(box.Contains(fruit));
   Console.WriteLine($"元素個數:{box.Count}");
   Console.WriteLine(box.Remove(fruit));
   Console.WriteLine($"元素個數:{box.Count}");
   Console.ReadKey();
}

//輸出顯示:
apple 14
orange 18
grape 30
banana 20
元素個數:4
True
元素個數:5
True
元素個數:4

 


那個參考三關於幾個接口的用處說得很詳細,要牢牢記住。
不過我認為 C# 還是設計得太高端了,我們自己實現這些感覺都是在系統給的類型上包裹一下,不過話說回來也是很方便和放心。等以后功力深厚了再去研究系統給的那幾個類型。

本文結束。再次感謝現階段宇宙最完美的C#語言的IDE Visual Studio,該我們這些初學者帶來許多便利。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM