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。
推薦閱讀:
- C#中的yield關鍵字詳解
- C# 9 新特性之增強的foreach詳解
- C#中Foreach循環遍歷的本質與枚舉器詳解
- c# Async streams的使用解析
- C#中IEnumerable、ICollection、IList、List之間的區別