Khóa học lập trình C# căn bản

Serial tutorial hướng dẫn lập trình C# cơ bản

Lớp String trong Lập trình C# căn bản Lớp String trong Lập trình C# căn bản Lớp String trong Lập trình C# căn bản Lớp String trong Lập trình C# căn bản Lớp String trong Lập trình C# căn bản 5/5 (279 reviews)

Lớp String trong Lập trình C# căn bản

Đã đăng 2016-11-04 10:55:27 bởi Kteam
10 bình luận 26370 lượt xem
Lớp String trong Lập trình C# căn bản 5 /5 stars (3 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về CẤU TRÚC LẶP FOREACH TRONG C# . Hôm nay chúng ta sẽ cùng tìm hiểu về String trong C#.


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:

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ỆUBIẾ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 = "HowKteam";

            a.Substring(3, 1);

Thì biến a sau khi thực hiện lệnh Substring vẫn mang giá trị là “HowKteam” .

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:

 /*
             * Khai báo 1 biến kiểu chuỗi tên là FullName
             * Khai báo 1 biến Result chứa kết quả chuẩn hoá chuỗi.
             * Giá trị biến FullName được nhập từ bàn phím.
             */
            string FullName;
            string Result = "";

            Console.Write(" Moi ban nhap ho va ten: ");
            FullName = Console.ReadLine();

            /* Cắt các khoảng trắng dư ở đầu và cuối chuỗi */
            FullName = FullName.Trim();

            /* 
             * Trong khi còn tìm thấy 2 khoảng trắng
             * thì thực hiện thay thế 2 khoảng trắng bằng 1 khoảng trắng
             */
            while (FullName.IndexOf("  ") != -1)
            {
                FullName = FullName.Replace("  ", " ");
            }
            /*
             * Cắt chuỗi họ tên ra thành mảng các từ.
             * Sau đó duyệt mảng để chuẩn hoá từng từ một.
             * Khi duyệt mỗi từ ta thực hiện cắt ra chữ cái đầu trên và lưu trong biến FirstChar
             * Cắt các chữ cái còn lại và lưu trong biến OtherChar.
             * Thực hiện viết hoa chữ cái đầu và viết thường các chữ cái còn lại.
             * Cuối cùng là lưu chữ vừa chuẩn hoá vào biến Result.
             */
            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();
                Result += SubName[i] + " ";
            }

            Console.WriteLine(" Ho ten cua ban la: " + Result);

Trong code mình đã chú thích rất rõ ý nghĩa của từng đoạn lệnh, các bạn xem qua để hiểu hơn. Ở đoạn:

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();
                Result += SubName[i] + " ";
            }

Chúng ta có thể viết gọn lại thành:

for (int i = 0; i < SubName.Length; i++)
            {
                SubName[i] = SubName[i].Substring(0, 1).ToUpper() +SubName[i].Substring(1).ToLower();
                Result += SubName[i] + " ";
            }

Nhưng viết như vậy đôi khi gây khó hiểu cho những bạn mới bắt đầu nên mình cố tình viết tường minh để các bạn dễ hiểu hơn.

Kết quả khi chạy chương trình trên:

kteam

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ư ý. Các bạn hãy thử vận dụng kiến thức đã học để giải quyết xem sao nhé!


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 + "Kteam";

Ở 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ị “Kteam”.
  • 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("Kteam");

Ở 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ị “Kteam”.
  • Mở rộng vùng nhớ của MutableValue để nối chuỗi “Kteam” 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 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#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.



Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học String trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Lớp String trong Lập trình C# căn bản
Vũ Minh Công 2018-11-19 15:40:01
using System;

namespace Desktop
{
    class Program
    {
		static void ProcessingFullName(ref string strName)
		{
			//Cắt khoảng trắng đầu cuối
			strName = strName.Trim().ToLower();
			
			//Cắt khoảng trắng thừa ở giữa
			while(strName.IndexOf("  ") != -1)
			{
				strName = strName.Replace("  ", " ");
			}
			
			//In hoa chữ cái đầu
			string[] listStrName = strName.Split(' ');
			strName = "";
			foreach(string str in listStrName)
			{
				string firstStr = str[0].ToString().ToUpper();
				string secondStr = str.Substring(1, str.Length - 1);
				strName += firstStr + secondStr + " ";
			}
			strName = strName.Trim();
		}
        static void Main(string[] args)
        {
			string strName = "";
			strName = Console.ReadLine();
			ProcessingFullName(ref strName);
			
			Console.WriteLine(strName);
        }
    }
}

 

0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
palladium88 2018-09-25 15:35:33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Xulichuoi
{
    class Program
    {
        static void Main(string[] args)
        {
            string Name, KQ ="";

            Console.Write("Ten cua ban la gi: ");
            Name = Console.ReadLine();

            Name = Name.Trim();

            while (Name.IndexOf('\t') != -1) // Thay phím Tab bằng kí tự khoảng trắng
            {
                Name = Name.Replace('\t', ' ');
            }

            while (Name.IndexOf("  ") != -1) // Thay 2 khoảng trắng bằng 1 khoảng trắng
            {
                Name = Name.Replace("  "," ");
            }
            
            string[] TrueName = Name.Split(' ');
            for (int i = 0; i < TrueName.Length; i++)
            {
                string First = TrueName[i].Substring(0,1);
                string Other = TrueName[i].Substring(1);
                TrueName[i] = First.ToUpper() + Other.ToLower();
                KQ += TrueName[i] + " ";
            }

            Console.WriteLine("Ten day du cua ban la: " + KQ);
            Console.ReadKey();
        }
    }
}

 

0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
Sonlanggtu 2018-01-12 15:40:56

Bạn nào không Create Stringbuilder thì thêm using System.Text;

thử test xem đoạn code này :


using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder builder = new StringBuilder(
            "This is an example string that is an example.");
        builder.Replace("an", "the"); // Replaces 'an' with 'the'.
        Console.WriteLine(builder.ToString());
        Console.ReadLine();
    }
}

1 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
manincode 2017-12-10 14:17:03

Mình có ý kiến trong phần "Ứng dụng lớp String vào việc xử lý chuỗi".

Nếu code Result += SubName[i] + " "; thì chữ cuối cùng sẽ có 1 khoảng trắng. Ví dụ "How Kteam ". Mình nghĩ là nên code vầy để không có khoảng trắng ở cuối 

if (i == Substring.Length - 1) Result += Substring[i];

                else Result += Substring[i] + " ";

1 bình chọn
Reply
View all 2 comments
Kteam - Howkteam Free Education
K9 2017-12-14 13:12:47
ngon men
0 bình chọn
Reply
Kteam - Howkteam Free Education
Sonlanggtu 2018-01-12 15:43:08
nó bị khoảng trắng ở đầu do đặt result = &quot; &quot; thì chỉ cần đặt lại result = null là mất space ở đầu
0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
thamtunamle99 2017-07-14 23:07:21

Sao máy em code StringBuilder lại không được ạ

Có phải là thiết using hay là cái gì đó phải không ạ

0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
K9 2017-02-12 10:12:03
kkkkkk
0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
K9 2017-02-12 10:11:52
h
0 bình chọn
Reply
Lớp String trong Lập trình C# căn bản
bboy114crew 2016-12-28 19:26:48
Làm tiếp series này đi anh :3 hay rất hay và căn bản ;)
0 bình chọn
Reply
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education