zoukankan      html  css  js  c++  java
  • 自定义集合初始化器

    对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();
            }
  • 相关阅读:
    使用 BinToHex() 把 TBytes 转换为十六进制字符串 回复 "梧桐栖凤" 的问题
    ASP.NET中UrlEncode应该用Uri.EscapeDataString()
    抛弃WebService,在.NET4中用 jQuery 调用 WCF
    事实证明Ajax的世界更需要ASP.NET MVC
    tinyMCEPopup.close轻松让IE 9 RC崩溃
    不走寻常路:在WebForm中使用MVC
    关于ASP.NET预编译
    不错的VS2010扩展——JSEnhancements,让js和css也折叠
    VS2010 SP1 Beta与VisualSVN的冲突引起VS2010关闭时重启
    Web应用架构探索笔记 —— 查询
  • 原文地址:https://www.cnblogs.com/darrenji/p/3818219.html
Copyright © 2011-2022 走看看