首页 > 代码库 > 自定义集合初始化器

自定义集合初始化器

对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();        }