Nội dung
Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:
- Cấu trúc cơ bản của một chương trình C# console application
- BIẾN và KIỂU DỮ LIỆU trong C#
- TOÁN TỬ TRONG C#
- CÂU ĐIỀU KIỆN TRONG C#
- CẤU TRÚC CƠ BẢN CỦA VÒNG LẶP
- CẤU TRÚC CƠ BẢN CỦA HÀM TRONG C#
- MẢNG 1 CHIỀU TRONG C#
Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:
- Lớp String trong C#
- Ứng dụng lớp String vào việc xử lý chuỗi.
- Lớp StringBuilder trong C#
Lớp String trong C#
String là một kiểu dữ liệu tham chiếu được dùng để lưu trữ chuỗi ký tự. Vì là một kiểu dữ liệu nên cách khai báo và sử dụng hoàn toàn tương tự các kiểu dữ liệu khác (đã trình bày trong bài KIỂU DỮ LIỆU và BIẾN)
Hôm nay mình sẽ không bàn đến khai báo của nó nữa mà đi sâu vào các thuộc tính và phương thức mà lớp String hỗ trợ.
- Thuộc tính trong lớp String:
- Một số phương thức thường dùng trong lớp String:
Lưu ý:
- Các phương thức mà mình có ghi String phía trước là các phương thức gọi thông qua tên lớp. Các phương thức còn lại được gọi thông qua đối tượng.
- Các phương thức khi gọi sẽ tạo ra đối tượng mới rồi thao tác trên đối tượng đó chứ không thao tác trực tiếp với đối tượng đang xét. Vì thế nếu như các bạn gọi
string a = "mcttvietnam"; a.Substring(3, 1);
Thì biến a sau khi thực hiện lệnh Substring vẫn mang giá trị là “mcttvietnam” .
Nếu muốn biến a mang giá trị mới khi thực hiện Substring thì bạn phải gán ngược lại giá trị mới đó cho biến a:
a = a.Substring(3, 1);
- Bạn có thể xem 1 chuỗi là 1 mảng các ký tự. Như vậy ta hoàn toàn có thể truy xuất đến từng ký tự như truy xuất đền phần tử của mảng (Truy xuất đến một phần tử của mảng đã trình bày trong bài MẢNG 1 CHIỀU TRONG C#)
- Ở trên chỉ là các phương thức hay dùng ngoài ra còn rất nhiều phương thức khác các bạn có thể tự khám phá thêm.
Ứng dụng lớp String vào việc xử lý chuỗi
Để hiểu rõ cách sử dụng các phương thức trên. Chúng ta cùng thực hiện chuẩn hoá một chuỗi họ tên của người dùng với các yêu cầu:
- Cắt bỏ hết các khoảng trắng dư ở đầu cuối chuỗi. Các từ cách nhau một khoảng trắng nếu phát hiện có nhiều hơn 1 khoảng trắng thì thực hiện cắt bỏ.
- Viết hoa chữ cái đầu tiên của mỗi từ, các chữ cái tiếp theo thì viết thường.
Ý tưởng:
- Cắt khoảng trắng dư ở đầu và cuối chuỗi thì ta có thể sử dụng phương thức Trim.
- Khoảng trắng ở giữa thì ta sẽ duyệt cả chuỗi nếu phát hiện có 2 khoảng trắng thì thay thế nó bằng 1 một khoảng trắng. Để làm điều này ta có thể dùng:
- IndexOf để phát hiện khoảng trắng.
- Replace để thay thế 2 khoảng trắng thành 1 khoảng trắng.
- Viết hoa chữ cái đầu và viết thường các chữ cái còn lại thì ta có thể cắt chuỗi họ tên ra thành các từ và ứng với mỗi từ ta thực hiện như yêu cầu đề bài. Để làm điều này ta có thể sử dụng:
- Split để cắt ra các từ.
- Substring để cắt ra các chữ cái mong muốn.
- ToUpper để viết hoa và ToLower để viết thường.
Bây giờ các bạn hãy làm thử trước khi xem code tham khảo của mình nào!
Sau đây là code tham khảo để giải quyết các vấn đề trên:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Bai_25_01 { class Program { static void Main(string[] args) { string FullName; String ResultName=""; Console.Write("Nhap ho va ten : "); FullName = Console.ReadLine(); //Cat khoang trang dau va cuoi chuoi FullName = FullName.Trim(); //Tim 2 khoang trang thi thay the bang 1 khoang trang while (FullName.IndexOf(" ") !=-1) { FullName = FullName.Replace(" "," "); } /* * Cat chuoi ho ten ra thanh cac tu * Sau do duyet mang de chuan hoa tung tu mot * Khi duyet moi tu ra thuc hien cac chu cai dau tien va luu tru trong FirstChar * Thuc hien viet hoa chu cai dau va viet thuong cac chu con lai * Cuoi cung la luu vao bien ResultName. */ string[] SubName = FullName.Split(' '); for (int i=0;i<SubName.Length;i++) { string FirstChar = SubName[i].Substring(0, 1); string OtherChar = SubName[i].Substring(1); SubName[i] = FirstChar.ToUpper() + OtherChar.ToLower(); ResultName += SubName[i] + " "; } Console.WriteLine("Ho Ten cua ban la: " + ResultName); Console.ReadLine(); } } }
Chương trình trên vẫn còn 1 lỗi nhỏ đó là nếu như bạn không nhấn phím space để tạo khoảng trắng mà nhấn phím Tab thì chương trình sẽ không ra kết quả như ý.
Code them
// fix người dùng cách bằng nút tab while (Fullname.IndexOf("\t") != -1) { Fullname = Fullname.Replace("\t", " "); }
Lớp StringBuilder trong C#
Đặc điểm
Lớp StringBuilder được .NET xây dựng sẵn giúp chúng ta thao tác trực tiếp với chuỗi gốc và giúp tiết kiệm bộ nhớ hơn so với lớp String.
Đặc điểm của StringBuilder là:
- Cho phép thao tác trực tiếp trên chuỗi ban đầu.
- Có khả năng tự mở rộng vùng nhớ khi cần thiết.
- Không cho phép lớp khác kế thừa (khái niệm về kế thừa sẽ được trình bày trong bài KẾ THỪA TRONG C#).
Từ 2 đặc điểm này đã làm nổi bật lên ưu điểm của StringBuilder so với String đó là ít tốn bộ nhớ. Cụ thể qua ví dụ sau:
string Value = "How";
Value = Value + "mctt";
Ở 2 dòng lệnh ta có thể thấy bộ nhớ sẽ được lưu trữ như sau:
- Đầu tiên tạo 1 vùng nhớ đối tượng kiểu string tên là Value.
- Tạo 1 vùng nhớ chứa giá trị “mctt”.
- Khi thực hiện toán tử cộng trên 2 chuỗi sẽ tạo ra 1 vùng nhớ nữa để chứa giá trị chuỗi mới sau khi cộng.
- Cuối cùng là phép gán sẽ thực hiện trỏ đối tượng Value sang vùng nhớ chứa chuỗi kết quả của phép cộng.
Như vậy ta thấy sẽ có 1 vùng nhớ không sử dụng nhưng vẫn còn nằm trong bộ nhớ, đó là vùng nhớ chứa giá trị “How” – giá trị ban đầu của biến Value.
Đối với StringBuilder thì khác:
StringBuilder MutableValue = new StringBuilder("How");
MutableValue.Append("mctt");
Ở 2 câu lệnh trên bộ nhớ sẽ lưu trữ như sau:
- Tạo một vùng nhớ cho đối tượng MutableValue chứa giá trị “How”.
- Tạo một vùng nhớ chứa giá trị “mctt”.
- Mở rộng vùng nhớ của MutableValue để nối chuỗi “mctt” vào sau chuỗi “How”.
Rõ ràng là ta không tạo ra quá nhiều vùng nhớ và cũng không lãng phí bất cứ vùng nhớ nào.
Sử dụng
Cách khởi tạo 1 đối tượng StringBuilder có đôi chút khác so với String.
Cú pháp:
- Khởi tạo một đối tượng rỗng:
StringBuilder <tên biến> = new StringBuilder();
- Khởi tạo một đối tượng chứa 1 chuỗi cho trước:
StringBuilder <tên biến> = new StringBuilder(<chuỗi giá trị>);
Trong lớp StringBuilder có các phương thức như: Remove, Insert, Replace được sử dụng hoàn toàn giống như lớp String.
Chỉ có vài phương thức mới các bạn cần chú ý:
Lưu ý:
- Các bạn nhớ đây là đối tượng kiểu StringBuilder nên thao tác với chuỗi như gán, nối chuỗi, . . . phải thông qua các phương thức chứ không thể thực hiện trực tiếp được.
- Giữa String và StringBuilder đều có cái hay riêng của nó. Tuỳ vào từng yêu cầu của bài toán mà nên sử dụng cho hợp lý, tránh lạm dụng quá nhiều 1 kiểu:
- Thông thường đối với các bài toán đòi hỏi thao tác nhiều với chuỗi gốc như cộng chuỗi, chèn chuỗi, xoá bỏ một số ký tự, . . . thì nên sử dụng StringBuilder để tối ưu bộ nhớ.
- Còn lại thì nên sử dụng String để việc thao tác thuận tiện hơn.
Kết luận
Nội dung bài này giúp các bạn nắm được:
- Lớp String trong C#.
- Ứng dụng lớp String vào xử lý chuỗi.
- Lớp StringBuilder trong C#.
Bài sau chúng ta sẽ tìm hiểu về STRUCT TRONG C#.