C#自定義集合初始化器

對int類型集合初始化,這樣寫:

        static void Main(string[] args)
        {
            var list = new List<int> {0, 1};
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

對鍵值對集合初始化,這樣寫:

        static void Main(string[] args)
        {
            var dic = new Dictionary<string, string>
            {
                {"location", "qingdao"},
                {"street","lingchuang"}
            };

            foreach (var item in dic)
            {
                Console.WriteLine("{0}:{1}", item.Key, item.Value);
            }
            Console.ReadKey();
        }

編譯器是如何"讀懂"集合初始化器?

編譯器根據慣例來理解集合初始化器,即約定:如果一個類型實現IEnumerable<T>接口,並且提供瞭Add(object obj)方法,該類型可以使用集合初始化器。

假設,我們想通過一個集合初始化器來定義一個模特的集合,以胸圍、腰圍、臀圍作為集合初始化器的參數:

var list = new MoTes{
    {79, 60, 89},
    {82, 63, 90}
};

{79, 60, 89}就像int類型一樣,是一個數據結構,把它定義成結構類型:

    public struct SanWei
    {
        public readonly double _Xiong;
        public readonly double _Yao;
        public readonly double _Tun;

        //構造函數的參數類型、順序和數量決定瞭集合初始化器的參數類型、順序和數量
        public SanWei(double xiong, double yao, double tun)
        {
            _Xiong = xiong;
            _Yao = yao;
            _Tun = tun;
        }
    }

而想讓MoTes類可以使用集合初始化器,需要滿足2個條件:

  • 1、實現IEnumerable<SanWei>接口
  • 2、提供Add(double xiong, double yao, double tun)方法
    public class MoTes : IEnumerable<SanWei>
    {
        private readonly List<SanWei> _motes;

        public MoTes()
        {
            _motes = new List<SanWei>();
        }

        public void Add(double xiong, double yao, double tun)
        {
            _motes.Add(new SanWei(xiong, yao, tun));
        }
        public IEnumerator<SanWei> GetEnumerator()
        {
            return _motes.GetEnumerator();
        }

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

在客戶端:

        static void Main(string[] args)
        {
            var list = new MoTes()
            {
                {79, 60, 89},
                {82, 63, 90}
            };
            foreach (var item in list)
            {
                Console.WriteLine("胸圍:{0},腰圍:{1},臀圍:{2}",item._Xiong, item._Yao, item._Tun);
            }
            Console.ReadKey();
        }

到此這篇關於C#自定義集合初始化器的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: