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-defined và String với các nội dung sau:
- Kiểu User-defined là gì?
- Mục đích chuyển đổi là gì? Và khi nào thì chúng ta cần chuyển đổi?
- 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() |
#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(); }
[…] Việc thực hiện sẽ được trình bày chi tiết trong bài Cách chuyển đổi qua lại giữa kiểu dữ liệu tự định nghĩa và Kiểu string trong […]