Chuỗi trong C#

Trong C#, bạn có thể sử dụng chuỗi dưới dạng mảng ký tự, tuy nhiên, thực tế phổ biến hơn là sử dụng từ khóa string để khai báo biến chuỗi. Từ khóa string là bí danh cho lớp System.String.

Tạo một đối tượng string

Bạn có thể tạo đối tượng string bằng một trong các phương thức sau:

  • Bằng cách gán một chuỗi ký tự cho một biến String.
  • Bằng cách sử dụng một phương thức khởi tạo lớp String.
  • Bằng cách sử dụng toán tử nối chuỗi (+).
  • Bằng cách lấy một thuộc tính hoặc gọi một phương thức trả về một chuỗi.
  • Bằng cách gọi một phương thức định dạng để chuyển đổi một giá trị hoặc một đối tượng thành biểu diễn chuỗi của nó.

Ví dụ sau đây minh họa điều này:

using System;

namespace StringApplication 
{
   class Program 
   {   
      static void Main(string[] args) 
      {
         string fname = "Trung", lname = "Nguyen";
			
         char[] letters = { 'H', 'e', 'l', 'l','o' };
         string[] sarray = { "Hello", "From", "Comdy" };
         
         string fullname = fname + " " + lname;
         Console.WriteLine("Full Name: {0}", fullname);
         
         //by using string constructor { 'H', 'e', 'l', 'l','o' };
         string greetings = new string(letters);
         Console.WriteLine("Greetings: {0}", greetings);
         
         //methods returning string { "Hello", "From", "Comdy" };
         string message = String.Join(" ", sarray);
         Console.WriteLine("Message: {0}", message);
         
         //formatting method to convert a value
         DateTime waiting = new DateTime(2020, 03, 28, 17, 58, 1);
         string chat = String.Format("Message sent at {0:t} on {0:D}", waiting);
         Console.WriteLine("Message: {0}", chat);
      }
   }
}

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

Full Name: Trung Nguyen
Greetings: Hello
Message: Hello From Comdy
Message: Message sent at 5:58 PM on Saturday, March 28, 2020
Tip: bạn nên sử dụng phương thức string.Format() hoặc class StringBuilder để nối chuỗi thay vì sử dụng toán tử + để cộng chuỗi.

Thuộc tính của lớp String

Lớp String có hai thuộc tính sau:

STT Thuộc tính Mô tả
1 Chars Lấy đối tượng Char tại một vị trí cụ thể trong đối tượng String hiện tại
2 Length Lấy số ký tự của đối tượng String hiện tại

Các phương thức của lớp String

Lớp String có nhiều phương thức giúp bạn làm việc với chuỗi. Bảng sau đây cung cấp một số phương thức được sử dụng phổ biến nhất:

STT Phương thức
1 public static int Compare(string strA, string strB)

So sánh hai đối tượng String cụ thể và trả về một integer mà chỉ vị trí có liên quan của chúng trong thứ tự sắp xếp

2 public static int Compare(string strA, string strB, bool ignoreCase )

So sánh hai đối tượng String cụ thể và trả về một integer mà chỉ vị trí có liên quan của chúng trong thứ tự sắp xếp. Tuy nhiên, nó bỏ qua sự phân biệt kiểu nếu tham số Boolean là true

3 public static string Concat(string str0, string str1)

Nối chuỗi hai đối tượng String

4 public static string Concat(string str0, string str1, string str2)

Nối chuỗi ba đối tượng String

5 public static string Concat(string str0, string str1, string str2, string str3)

Nối chuỗi bốn đối tượng String

6 public bool Contains(string value)

Trả về một giá trị chỉ dẫn có hay không đối tượng String đã cho xuất hiện bên trong chuỗi này

7 public static string Copy(string str)

Tạo một đối tượng String mới với cùng giá trị như chuỗi đã cho

8 public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)

Sao chép một số ký tự cụ thể từ một vị trí đã cho của đối tượng String tới một vị trí đã xác định trong một mảng các ký tự Unicode

9 public bool EndsWith(string value)

Xác định có hay không phần kết thúc của đối tượng String là so khớp với chuỗi đã cho

10 public bool Equals(string value)

Xác định có hay không đối tượng String hiện tại và đối tượng String đã cho là có cùng giá trị

11 public static bool Equals(string a, string b)

Xác định có hay không hai đối tượng String đã cho có cùng giá trị

12 public static string Format(string format, Object arg0)

Thay thế một hoặc nhiều mục định dạng trong một chuỗi đã cho với biểu diễn chuỗi của một đối tượng cụ thể

13 public int IndexOf(char value)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của ký tự Unicode đã cho trong chuỗi hiện tại

14 public int IndexOf(string value)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của chuỗi đã cho trong Instance (sự thể hiện) này

15 public int IndexOf(char value, int startIndex)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của ký tự Unicode đã cho trong chuỗi này, bắt đầu tìm kiếm tại vị trí của ký tự đã cho

16 public int IndexOf(string value, int startIndex)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của chuỗi đã cho trong Instance (sự thể hiện) này, bắt đầu tìm kiếm tại vị trí của ký tự đã cho

17 public int IndexOfAny(char[] anyOf)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của Instance (sự thể hiện) này của bất kỳ ký tự nào trong một mảng ký tự Unicode đã xác định

18 public int IndexOfAny(char[] anyOf, int startIndex)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của Instance (sự thể hiện) này của bất kỳ ký tự nào trong một mảng ký tự Unicode đã xác định, bắt đầu tìm kiếm tại vị trí của ký tự đã cho

19 public string Insert(int startIndex, string value)

Trả về một chuỗi mới trong đó một chuỗi đã cho được chèn tại một vị trí có chỉ mục đã xác định trong đối tượng String hiện tại

20 public static bool IsNullOrEmpty(string value)

Chỉ rằng có hay không chuỗi đã cho là null hoặc là một chuỗi Empty

21 public static string Join(string separator, params string[] value)

Nối chuỗi tất cả phần tử của một mảng chuỗi, bởi sử dụng Separator (bộ tách) đã cho giữa mỗi phần tử

22 public static string Join(string separator, string[] value, int startIndex, int count)

Nối chuỗi các phần tử đã xác định của một mảng chuỗi, bởi sử dụng Separator (bộ tách) đã cho giữa mỗi phần tử

23 public int LastIndexOf(char value)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện cuối cùng của ký tự Unicode đã cho bên trong đối tượng String hiện tại

24 public int LastIndexOf(string value)

Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện cuối cùng của một chuỗi đã cho bên trong đối tượng String hiện tại

25 public string Remove(int startIndex)

Gỡ bỏ tất cả ký tự trong Instance hiện tại, bắt đầu tại vị trí đã xác định và tiếp tục tới vị trí cuối cùng, và trả về chuỗi đó

26 public string Remove(int startIndex, int count)

Gỡ bỏ số ký tự đã cho trong chuỗi hiện tại bắt đầu tại một vị trí đã xác định và trả về chuỗi đó

27 public string Replace(char oldChar, char newChar)

Thay thế tất cả ký tự Unicode đã cho xuất hiện trong đối tượng String hiện tại với ký tự Unicode đã xác định và trả về chuỗi mới

28 public string Replace(string oldValue, string newValue)

Thay thế tất cả chuỗi đã cho xuất hiện trong đối tượng String hiện tại với đối tượng string đã xác định và trả về chuỗi mới

29 public string[] Split(params char[] separator)

Trả về một mảng chuỗi mà chứa các chuỗi phụ trong đối tượng String hiện tại, được giới hạn bởi các phần tử của một mảng ký tự Unicode đã cho

30 public string[] Split(char[] separator, int count)

Trả về một mảng chuỗi mà chứa các chuỗi phụ trong đối tượng String hiện tại, được giới hạn bởi các phần tử của một mảng ký tự Unicode đã cho. Tham số int xác định số chuỗi phụ tối đa để trả về

31 public bool StartsWith(string value)

Xác định có hay không phần bắt đầu của instance của chuỗi này so khớp với chuỗi đã cho

32 public char[] ToCharArray()

Trả về một mảng ký tự Unicode với tất cả ký tự trong đối tượng String hiện tại

33 public char[] ToCharArray(int startIndex, int length)

Trả về một mảng ký tự Unicode với tất cả ký tự trong đối tượng String hiện tại, bắt đầu từ chỉ mục đã xác định và tới độ dài đã cho

34 public string ToLower()

Trả về một bản sao của chuỗi này đã được biến đổi thành chữ thường

35 public string ToUpper()

Trả về một bản sao của chuỗi này đã được biến đổi thành chữ hoa

36 public string Trim()

Gỡ bỏ tất cả ký tự whitespace từ đối tượng String hiện tại

Bạn có thể truy cập thư viện MSDN để biết danh sách đầy đủ các phương thức và các hàm tạo của lớp String.

Ví dụ

So sánh chuỗi

using System;

namespace StringApplication 
{
   class StringProg 
   {   
      static void Main(string[] args) 
      {
         string str1 = "This is test";
         string str2 = "This is text";

         if (String.Compare(str1, str2) == 0) 
         {
            Console.WriteLine(str1 + " and " + str2 +  " are equal.");
         } 
         else 
         {
            Console.WriteLine(str1 + " and " + str2 + " are not equal.");
         }
         Console.ReadKey() ;
      }
   }
}

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

This is test and This is text are not equal.

Chuỗi chứa chuỗi

using System;

namespace StringApplication 
{
   class StringProg 
   {   
      static void Main(string[] args) 
      {
         string str = "This is test";
         
         if (str.Contains("test")) 
         {
            Console.WriteLine("The sequence 'test' was found.");
         }
         Console.ReadKey() ;
      }
   }
}

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

The sequence 'test' was found.

Cắt chuỗi

using System;

namespace StringApplication 
{
   class StringProg 
   {   
      static void Main(string[] args) 
      {
         string str = "Last night I dreamt of San Pedro";
         Console.WriteLine(str);
         string substr = str.Substring(23);
         Console.WriteLine(substr);
         Console.ReadKey();
      }
   }
}

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

Last night I dreamt of San Pedro
San Pedro

Nối chuỗi

using System;

namespace StringApplication 
{
   class StringProg 
   {   
      static void Main(string[] args) 
      {
         string[] starray = new string[]
         { 
         	"Down the way nights are dark",
            "And the sun shines daily on the mountain top",
            "I took a trip on a sailing ship",
            "And when I reached Jamaica",
            "I made a stop"
         };

         string str = String.Join("\n", starray);
         Console.WriteLine(str);
         Console.ReadKey();
      }
   }
}

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

Down the way nights are dark
And the sun shines daily on the mountain top
I took a trip on a sailing ship
And when I reached Jamaica
I made a stop

StringBuilder trong C#

Chuỗi là bất biến, có nghĩa là chuỗi không thể thay đổi khi đã được tạo.

Ví dụ: chuỗi  "Hello World !!" sẽ chiếm một không gian trong bộ nhớ heap. Bây giờ, bằng cách thay đổi chuỗi ban đầu "Hello World !!" thành "Hello World !! from Comdy" sẽ tạo một đối tượng chuỗi mới trên bộ nhớ heap thay vì cập nhật chuỗi ban đầu tại cùng một địa chỉ bộ nhớ.

Hành vi này sẽ làm giảm hiệu suất nếu cùng một chuỗi thay đổi nhiều lần bằng cách thay thế, nối thêm, xóa hoặc chèn chuỗi mới trong chuỗi ban đầu.

Để giải quyết vấn đề này, C # đã giới thiệu StringBuilder. StringBuilder là một đối tượng động cho phép bạn mở rộng số lượng ký tự trong chuỗi.

Nó không tạo ra một đối tượng mới trong bộ nhớ mà tự động mở rộng bộ nhớ để chứa chuỗi đã sửa đổi.

Khởi tạo StringBuilder

StringBuilder có thể được khởi tạo giống như lớp.

StringBuilder sb = new StringBuilder();            
//or
StringBuilder sb = new StringBuilder("Hello World!!");

Các phương thức quan trọng của StringBuilder

Phương thức Append() / AppendLine()

Sử dụng phương thức Append() của StringBuilder để thêm hoặc nối một chuỗi vào StringBuilder. Phương thức AppendLine() nối thêm chuỗi với một dòng mới ở cuối.

StringBuilder sb = new StringBuilder("Hello");

sb.Append(" World!!");
sb.AppendLine("Hello C#!");
sb.AppendLine("This is new line.");

Console.WriteLine(sb);

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

Hello World!!Hello C#!
This is new line.

Phương thức Replace()

Phương thức Replace() thay thế tất cả sự xuất hiện của một chuỗi được chỉ định bằng một chuỗi thay thế.

StringBuilder sb = new StringBuilder("Hello World!!",50);
sb.Replace("World", "C#");

Phương thức ToString()

Sử dụng phương thức ToString() để lấy chuỗi từ StringBuilder.

StringBuilder sb = new StringBuilder("Hello World!!");
string str = sb.ToString();

Bạn có muốn xem bài viết tiếp theo không? Nó ở dưới đây nè.

Struct và Enum trong C# | Comdy
Struct và Enum trong C# là gì? Các sử dụng như thế nào? Bài viết này sẽ giúp bạn.
Lập Trình C#Lập Trình C# Cơ Bản
Bài Viết Liên Quan:
int[] và int[,] trong C#: Ai nhanh hơn
Trung Nguyen 10/10/2020
int[] và int[,] trong C#: Ai nhanh hơn

Hiểu được sự khác biệt giữa các loại mảng trong C# sẽ giúp bạn chọn cấu trúc dữ liệu chính xác cho mọi trường hợp.

Struct và class trong C#: Ai nhanh hơn
Trung Nguyen 09/10/2020
Struct và class trong C#: Ai nhanh hơn

Trong bài viết này, tôi sẽ so sánh sự khác biệt về hiệu suất giữa struct và class trong C#: Ai nhanh hơn.

Best practice cho performance trong C#
Trung Nguyen 03/10/2020
Best practice cho performance trong C#

Mục tiêu của bài viết này là cung cấp một danh sách không đầy đủ các code mẫu cần tránh, vì chúng rủi ro hoặc performance kém.

Đọc ghi file (File I/O) trong C#
Trung Nguyen 26/04/2020
Đọc ghi file (File I/O) trong C#

Hướng dẫn này sẽ giúp bạn tìm hiểu về đọc ghi file (File I/O) trong C# và sử dụng các lớp tiện ích để đọc ghi file.