Khởi tạo collection (Collection Initializer) cho phép bạn chỉ định một hoặc nhiều bộ khởi tạo phần tử khi bạn khởi tạo một loại collection thực hiện IEnumerable và có Add thêm một instance method hoặc một extension method. Bộ khởi tạo phần tử của một collection có thể là một giá trị đơn giản, biểu thức hoặc cũng có thể là một object initializer.
Xem thêm: Extension method trong C# là gì? Và cách sử dụng của nó.
using System.Collections.Generic; namespace MinhHoangBlog { public class Person { // Field private int id { get; set; } // Auto-Implemented Properties public string name { get; set; } public int age { get; set; } // Constructor public Person(int inId) { id = inId; } public override string ToString() => "id: " + id + ", name: " + name + ", age: " + age; } class Program { static void Main(string[] args) { // Theo cách thông thường var listPerson1 = new List<Person>(); listPerson1.Add(new Person(1)); listPerson1.Add(new Person(2)); listPerson1.Add(new Person(3)); // Sử dụng Collection Initializer var listPerson2 = new List<Person> { new Person(1), new Person(2), new Person(3) }; // Kết hợp Collection Initializer + Object Initializer var listPerson3 = new List<Person> { new Person(1) { name = "Minh Hoang", age = 20 }, new Person(2), new Person(3) { name = "www.minhhn.com", age = 3 } }; var dicPerson = new Dictionary<int, Person>() { { 1, new Person(1) { name = "Minh Hoang", age = 20 } }, { 2, new Person(2) }, { 3, new Person(3) { name = "www.minhhn.com", age = 3 } } }; } } }
※listPerson1: [0] = {id: 1, name: , age: 0} [1] = {id: 2, name: , age: 0} [2] = {id: 3, name: , age: 0} ※listPerson2: [0] = {id: 1, name: , age: 0} [1] = {id: 2, name: , age: 0} [2] = {id: 3, name: , age: 0} ※listPerson3: [0] = {id: 1, name: Minh Hoang, age: 20} [1] = {id: 2, name: , age: 0} [2] = {id: 3, name: www.minhhn.com, age: 3} ※dicPerson: [0] = {[1, id: 1, name: Minh Hoang, age: 20]} [1] = {[2, id: 2, name: , age: 0]} [2] = {[3, id: 3, name: www.minhhn.com, age: 3]}
– Bạn có thể chỉ định null như một thành phần khi khởi tạo collection bằng tính năng collection initializer nếu phương thức Add của collection đó cho phép. Trong ví dụ bên dưới, List collection cho phép thêm phần tử là null, nên chúng ta có thể khởi tạo như sau:
var listPerson = new List<Person> { new Person(1) { name = "Minh Hoang", age = 20 }, null, new Person(3) { name = "www.minhhn.com", age = 3 } };
[0] = {id: 1, name: Minh Hoang, age: 20}
[1] = null
[2] = {id: 3, name: www.minhhn.com, age: 3}
– Bạn có thể chỉ định các phần tử được lập chỉ mục (indexed) nếu collection hỗ trợ read / write indexing:
var dicNumbers = new Dictionary<int, string> { [7] = "seven", [9] = "nine", [13] = "thirteen" }; var dicNumbers = new Dictionary<int, string> { {19, "nineteen" }, {23, "twenty-three" }, {42, "forty-two" } };
[0] = {[7, seven]} [1] = {[9, nine]} [2] = {[13, thirteen]} [0] = {[19, nineteen]} [1] = {[23, twenty-three]} [2] = {[42, forty-two]}
– Ví dụ sau đây cho thấy một đối tượng implement IEnumerable và chứa phương thức Add có nhiều tham số. Nó sử dụng collection initializer với nhiều phần tử cho mỗi mục trong danh sách tương ứng với các tham số và format của tham số của phương thức Add:
using System; using System.Collections; using System.Collections.Generic; namespace MinhHoangBlog { class FormattedAddresses : IEnumerable<string> { private List<string> internalList = new List<string>(); public IEnumerator<string> GetEnumerator() => internalList.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => internalList.GetEnumerator(); public void Add(string firstname, string lastname, string zipcode, string city, string state, string buildingName) => internalList.Add( $@"{firstname} {lastname} {zipcode} {city}, {state} {buildingName}" ); } class Program { static void Main(string[] args) { FormattedAddresses addresses = new FormattedAddresses() { {"Minh", "Hoang", "471-0023", "Toyota-shi", "Nagoya", "Leopalace B" }, {"Tom", "Jerry", "450-0001", "Nakamura-ku", "Nagoya", "International Center Building" } }; Console.WriteLine("Address Entries:"); foreach (string addressEntry in addresses) { Console.WriteLine("\r\n" + addressEntry); } } } }
Address Entries: Minh Hoang 471-0023 Toyota-shi, Nagoya Leopalace B Tom Jerry 450-0001 Nakamura-ku, Nagoya International Center Building