自定义集合初始化器

对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();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值