Lập trình C#

Khởi tạo tập hợp (Collection Initializer C#3.0)

Khởi tạo tập hợp (Collection Initializer C#3.0)
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

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 }
								  };
Output:

[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ố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
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »