Lập trình C#

Cách chuyển đổi qua lại kiểu dữ liệu User-defined và String

Cách chuyển đổi qua lại kiểu dữ liệu User-defined và String
Đượ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ẽ.

Cách chuyển đổi qua lại kiểu dữ liệu User-defined và String

Trong bài viết này mình sẽ hướng dẫn cách chuyển đổi qua lại kiểu dữ liệu User-definedString với các nội dung sau:

  1. Kiểu User-defined là gì?
  2. Mục đích chuyển đổi là gì? Và khi nào thì chúng ta cần chuyển đổi?
  3. Cách thực hiện chuyển đổi giữa hai kiểu dữ liệu User-defined và String
1. Kiểu User-defined là gì?

– Kiểu User-defined là một kiểu dữ liệu do người dùng (tức là lập trình viên) tự định nghĩa để xử lý cho một logic cụ thể mà các kiểu có sẵn không hỗ trợ. Nó là tập hợp các nhóm dữ liệu có cùng đặc tính, cách lưu trữ và thao tác xử lý trên trường dữ liệu đó.

– Kiểu User-defined có thể là một kiểu dữ liệu độc lập, hoặc nó được kế thừa từ một kiểu dữ liệu có sẵn. Ví dụ:

  • Kiểu độc lập như là Sinh viên, Phân số, Động vật,…
  • Kiểu kế thừa từ kiểu có sẵn, chẳng hạn như trong winforms có lớp(kiểu) Button, giả sử chúng ta muốn button khi click vào thì nó sẽ rung lên trong 2 giây :D, điều này thì lớp(kiểu) Button có sẵn là không có, do đó chúng ta sẽ định nghĩa 1 kiểu dữ liệu mới kế thừa từ lớp(kiểu) Button để thực hiện yêu cầu này,…
2. Mục đích chuyển đổi là gì? Và khi nào thì chúng ta cần chuyển đổi?

Để chuyển dữ liệu sang một kiểu mong muốn phục vụ cho một hay nhiều xử lý nhất định. Chẳng hạn như là:

  • Để hiển thị data đẹp, dễ nhìn khi debug.
  • Khi bạn muốn ghi data ra file csv, hay file text,… thì bạn không thể dùng trực tiếp data của kiểu User-defined để ghi, mà cần chuyển qua kiểu String rồi mới ghi được.
  • Trong các dự án thì việc nhập liệu cho kiểu User-defined không phải thực hiện từ màn hình console, mà nó là các file text data để người dùng có thể thay đổi dữ liệu một cách linh hoạt, chúng ta cần đọc file data này rồi chuyển thành dữ liệu kiểu User-defined, sau đó mới tiếp tục các xử lý khác,…
3. Cách thực hiện chuyển đổi giữa hai kiểu dữ liệu User-defined và String

#3.1 Chuyển đổi kiểu User-defined sang String

Chúng ta có đoạn code sau:

using System;
using System.Text;
using System.Collections.Generic;

namespace MinhHoangBlog
{
	class Program
	{
		static void Main(string[] args)
		{
			// Khởi tạo danh sách sinh viên
			List<SinhVien> listSV = new List<SinhVien>();

			// Tạo 3 sinh viên
			SinhVien sv1 = new SinhVien( "1", "Phi", "Hung", "19", "Male", "Quy Nhon" );
			listSV.Add(sv1);

			SinhVien sv2 = new SinhVien( "2", "Viet", "Tung", "22", "Male", "Hoi An" );
			listSV.Add(sv2);

			SinhVien sv3 = new SinhVien( "3", "Minh", "Hoang", "26", "Male", "Da Nang" );
			listSV.Add(sv3);

			// Chuyển đổi danh sách kiểu User-defined: List<SinhVien>
			// sang danh sách kiểu String: List<String>
			List<string> listStr = new List<string>();

			foreach (var item in listSV)
			{
				listStr.Add(item.ToString());
			}

			Console.ReadKey();
		}
	}

	// Định nghĩa kiểu User-defined: SinhVien, để lưu các thông tin của một sinh viên. 
	class SinhVien
	{
		// Khai báo các thuộc tính của lớp(kiểu) sinh viên
		public string studentId { get; set; }
		public string firstName { get; set; }
		public string lastName { get; set; }
		public string age { get; set; }
		public string gender { get; set; }
		public string address { get; set; }

		// Constructor có tham số
		public SinhVien(string inId, string inFirst, string inLast, string inAge, string inGender, string inAdd)
		{
			studentId = inId;
			firstName = inFirst;
			lastName = inLast;
			age = inAge;
			gender = inGender;
			address = inAdd;
		}

		// override phương thức ToString() - Theo cách thông thường
		// để hiển thị data đẹp, dễ nhìn khi debug.
		// để chuyển đổi các đối tượng SinhVien sang kiểu String
		public override string ToString()
		{
			string strId = studentId + ", ";
			string strFirst = firstName + ", ";
			string strLast = lastName + ", ";
			string strAge = age + ", ";
			string strGender = gender + ", ";
			string strAdd = address;

			return strId + strFirst + strLast + strAge + strGender + strAdd;
		}

		// override phương thức ToString() - Theo cách dùng reflection
		// trong trường hợp số lượng thuộc tính của lớp tự định nghĩa quá nhiều
		// thì chúng ta dùng cách này sẽ làm code gọn đi rất nhiều.
//		public override string ToString()
//		{
//			var sbRtn = new StringBuilder();
//			foreach (System.Reflection.PropertyInfo property in this.GetType().GetProperties())
//			{
//				if (0 < sbRtn.Length)
//					sbRtn.Append( ", " );
//
//				sbRtn.Append(property.GetValue(this, null));
//			}
//
//			return sbRtn.ToString();
//		}
	}
}

・ Ở đoạn code trên nếu các bạn comment đoạn override phương thức ToString() lại thì kết quả sẽ thế nào?…
・ Sau khi xem xét xong, thì các bạn đặt breakpoint tại dòng 33 là Console.ReadKey(); rồi chạy đoạn code trên để biết kết quả nhé.
・ Bảng so sánh như sau: (có thể click vào hình để phóng to)

Không dùng phương thức ToString() Có phương thức ToString()
1. Không dùng method ToString() 1. Dùng method ToString()
2. Không dùng method ToString() 2. Dùng method ToString()

#3.2 Chuyển đổi kiểu String sang User-defined

Với đoạn code trên, bạn thay nội dung của hàm main() bằng đoạn code sau, rồi cũng giống như trên, bạn chạy với 2 trường hợp có sử dụng và không sử dụng override phương thức ToString() để so sánh kết quả nhé!

static void Main(string[] args)
{
	// Khai báo và khởi tạo list string
	List<string> listStr = new List<string> { "1, Phi, Hung, 19, Male, Quy Nhon",
											  "2, Viet, Tung, 22, Male, Hoi An",
											  "3, Minh, Hoang, 26, Male, Da Nang" };

	// Khai báo list kiểu user-defined: SinhVien
	List<SinhVien> listSV = new List<SinhVien>();

	// Chuyển đổi danh sách kiểu String: List<String>
	// sang danh sách kiểu User-defined: List<SinhVien>
	foreach (var str in listStr)
	{
		// Lấy 1 mảng các giá trị của chuỗi [str]
		string[] arrStr = str.Split(new[] { ", " }, StringSplitOptions.None);

		// Tạo sinh viên, và thêm vào danh sách
		SinhVien sv = new SinhVien(arrStr[0], arrStr[1], arrStr[2], arrStr[3], arrStr[4], arrStr[5]);
		listSV.Add(sv);
	}

	Console.ReadKey();
}

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[...]

1 bình luận

Translate »