C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Phương thức - Delegate §8 Lớp - Class §9 Namespace §10 Partial, Nested §11 Kiểu giá trị, tham chiếu §12 Kiểu vô danh và dynamic §13 Biểu thức lambda §14 Event §15 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §16 null và nullable §17 Mảng §18 Chuỗi ký tự §19 Tính kế thừa §20 Phương thức khởi tạo §21 Tính đa hình - abstract - interface §22 Struct và Enum §23 Ngoại lệ Exeption §24 IDisposable - using §25 File cơ bản §26 FileStream §27 Generic §28 Collection - List §29 SortedList §30 Queue / Stack §31 Linkedlist §32 Dictionary - HashSet §33 Phương thức mở rộng §34 ObservableCollection §35 LINQ §36 (Multithreading) async - bất đồng bộ §37 Type §38 Attribute Annotation §39 DI Dependency Injection §40 (Multithreading) Parallel §41 Thư viện lớp §42 (Networking) HttpClient §43 (Networking) HttpMessageHandler §44 (Networking) HttpListener §45 (Networking) Tcp TcpListenerr/TcpClient §46 (ADO.NET) SqlConnection §47 (ADO.NET) SqlCommand §48 (EF Core) Tổng quan §49 (EF Core) Tạo Model §50 (EF Core) Fluent API §51 (EF Core) Query §52 (EF Core) Scaffold §53 (EF Core) Migration §54 (ASP.NET CORE) Hello World! §55 (ASP.NET CORE) Middleware §56 (ASP.NET CORE) Map - Request - Response §57 (ASP.NET CORE) IServiceCollection - MapWhen §58 (ASP.NET CORE) Session - ISession §59 (ASP.NET CORE) Configuration §60 (ASP.NET CORE) Gửi Mail §61 (ASP.NET CORE) SASS/SCSS §62 (ASP.NET CORE) LibMan §63 (ASP.NET RAZOR) Khởi tạo và Route §64 (ASP.NET RAZOR) Cú pháp Razor §65 (ASP.NET RAZOR) Layout trong ASP.NET Core §66 (ASP.NET RAZOR) Partial §67 (ASP.NET RAZOR) ViewComponent §68 (ASP.NET RAZOR) TagHelper §69 (ASP.NET RAZOR) PageModel §70 (ASP.NET RAZOR) Model Binding §71 (ASP.NET RAZOR) HTML Form, Validation §72 (ASP.NET RAZOR) Upload File §73 (ASP.NET RAZOR) HtmlHelper §74 (ASP.NET RAZOR) Entity Framework §75 (ASP.NET RAZOR) Paging §76 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §77 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §78 (ASP.NET RAZOR) Identity (3) Google Login §79 (ASP.NET RAZOR) Identity (4) Facebook Login §80 (ASP.NET RAZOR) Identity (5) profile, password, email ... §81 (ASP.NET RAZOR) Identity (6) Role §82 (ASP.NET RAZOR) Identity (7) Role-based Authorization §83 (ASP.NET RAZOR) Identity (8) RoleClaim §84 (ASP.NET RAZOR) Identity (9) Authorization Handler §85 (ASP.NET RAZOR) IAuthorizationService §86 (ASP.NET MVC) Controller - View §87 (ASP.NET MVC) Route §88 (ASP.NET MVC) EF, Identity §89 (ASP.NET MVC) Binding, Validation §90 (ASP.NET MVC) Xây dựng Website(1) §91 (ASP.NET MVC) Xây dựng Website(2) §92 (ASP.NET MVC) Xây dựng Website(3) §93 (ASP.NET MVC) Xây dựng Website(4) §94 (ASP.NET MVC) Giỏ hàng - Cart (5) §95 (ASP.NET MVC) elFinder (5) §96 (ASP.NET MVC) SB Admin (6) §97 (ASP.NET MVC) Kestrel, publish
Mảng (Bài trước)
(Bài tiếp) Tính kế thừa

string - chuỗi ký tự C#

Chuỗi ký tự thực tế ta đã làm việc với nó ở các ví dụ trước, chuỗi là một tập hợp các ký tự sắp xếp có vị trí, nó chỉnh là một mảng các ký tự, kiểu dữ liệu chuỗi đó là string, lớp biểu diễn các chuỗi là System.String

Bạn có thể khai báo, khởi tạo chuỗi với kiểu string, cũng như thực hiện các phép toán trên chuỗi...

string sExample = "Xin chào";       // Khai báo và khởi tạo chuỗi
sExample += " các bạn";             // Nối chuỗi +=, trả về "Xin chào các bạn"
sExample = sExample + "!";          // Nối chuỗi +, trả về "Xin chào các bạn!"

Chuỗi như là mảng mà phần tử mảng là các ký tự, nên có thể truy cập phần tử mảng bằng indexer để đọc ký tự:

char c = sExample[1];               // c= 'i'

Chuỗi nhập vào viết trong cặp nháy kép "", chèn vào chuỗi các ký tự đặc biệt ta dùng ký hiệu \: ví dụ \\ là ký tự \, \" là ký tự ", \n là ký tự xuống dòng, \r là ký tự về đầu dòng ...

Viết chuỗi nguyên bản với ký hiệu @ trong C#

Khi viết chuỗi trong cặp dấu nháy kép "", thì các ký tự đặt biệt được xử lý với ký hiệu \, ví dụ nếu bạn viết:

string s = "C:\\Abc\\xyz";
// Nếu viết string s = "C:\Abc\xyz"; sẽ lỗi

Thì nội dung thực tế của chuỗi là C:\Abc\xyz

Nếu muốn viết chuỗi cố định, nội dung nguyên bản - cho biết sẽ không dùng \ để xử lý ký tự đặc biệt, thì thêm @ vào đầu chuỗi:

string s = @"Ký tự \ được dùng để chèn ký tự đặc biệt như \n, \r";

Bằng ký hiệu @ chuỗi viết thế nào thì nội dung thực tế sẽ như vậy, ngoại trừ hai ký tự "" chuyển thành một ký tự ""

string s = "Anh ấy nói, ""Đây là C#"""; //~ Anh ấy nói "Đây là C#"

Ngoài ra bạn có thể viết chuỗi trên nhiều dòng với ký hiệu @

string s = @"Xin chào các bạn
             Tôi đang học C#";

Chèn thêm biểu thức vào chuỗi với ký hiệu $ trong C#

Khi viết chuỗi có ký tự $ phía trước, thì trong chuỗi đó có thể chèn các biểu thức vào chỗ có cặp {} : {biểu-thức}

int a = 10;
int b = 2;
string s = $"Kết quả {a}/{b} là {a/b}";  // "Kết quả 10/2 là 5"

Ngoài ra bạn có thể căn lề, định dạng số, ngày tháng ... tương tự như chuỗi định dạng

Console.WriteLine($"{"VòngLặp",10} {"Chẵn/Lẻ", -5}");
for (int i = 8; i < 15; i++)
{
    string chanle = (i%2 == 0) ? "Chẵn" : "Lẻ";
    Console.WriteLine($"{i,10} {chanle, -5}");
}

Kết quả:
   VòngLặp Chẵn/Lẻ
         8 Chẵn
         9 Lẻ
        10 Chẵn
        11 Lẻ
        12 Chẵn
        13 Lẻ
        14 Chẵn

Ký hiệu {i,10} là để ra một khoảng trống 10 ký tự, chèn giá trị i vào khoảng trống đó với căn lề bên phải. Ký hiệu {chanle, -5} là đề ra 5 khoảng trống chèn giá trị và căn lề trái.

Một số phương thức làm việc với chuỗi C#

Ví dụ có hai biến chuỗi, thực hiện một số phép toán:

string stringA =  "Xin chào,";
string stringB = "các bạn!";
method Sử dụng
Concat phương thức tĩnh, nối các chuỗi liệt kê ở tham số lại với nhau
string s = String.Concat(stringA, stringB);    // s = "Xin chào,các bạn!"
Format Convert các đối tượng thành chuỗi và chèn chúng vào chuỗi định dạng được chỉ ra, cú pháp cơ bản
String.Format(stringFormat, arg0, arg1 ...)

Trong đó stringFormat là chuỗi định dạng, chứa mẫu và và vị trí mà arg0, arg1 ... sẽ chèn vào.

string s = String.Format("Chào {0}, {0} ơi, hôm nay ngày {1} rồi!", "Nam", DateTime.Now.Day);
// s = "Chào Nam, Nam hôm nay ngày 20 rồi!"

Nhìn vào, chuỗi định dạng chỗ nào có {0} sẽ được chèn bởi arg0("Nam"), chỗ nào có {1} sẽ được chèn bởi arg1 (20)

Tại các vị trí cần chèn {} có thể định dạng dữ liệu chèn vào, chi tiết xem tại Formatting

IndexOf Tìm vị trí (đầu tiên) của ký tự hoặc chuỗi ký tự trong chuỗi
LastIndexOf Tìm vị trí (cuối) của ký tự hoặc chuỗi ký tự trong chuỗi
Insert Tạo chuỗi = chèn chuỗi này vào trong chuỗi khác, vị trí chèn cần chỉ ra
var s = stringA.Insert(8, " tất cả"); // "Xin chào tất cả,"
PadLeft Tạo chuỗi mới từ chuỗi cũ, độ dài chuỗi mới chỉ ra - nếu độ dài chuỗi mới lớn hơn chuỗi cũ thì các ký tự phía đầu được chèn khoảng trắng hoặc ký tự chỉ định.
string s1 = "Abc";
string s2 = s1.PadLeft(6);        //  "   Abc"
string s3 = s1.PadLeft(6, '*');   //  "***Abc"
PadRight Tương tự PadLeft nhưng chèn khoảng trắng bên phải
Replace Tìm và thay thế trong chuỗi
var s = stringA.Replace("chào", "CHÀO");   // "Xin CHÀO,"
Split Trả về mảng các chuỗi con được chia từ chuỗi gốc bởi ký tự chia chỉ định, chuỗi chia chỉ định
var s = "Nguyễn Văn A".Split(' '); // s tương đương mảng {"Nguyễn","Văn", "A"}
ToLower Sinh chuỗi mới bằng cách chuyển các ký tự thành chữ thường
ToUpper Sinh chuỗi mới bằng cách chuyển các ký tự thành chữ in
Trim Sinh chuỗi mới bằng cách loại bỏ khoảng trắng (hoặc chỉ định) ở đầu và cuối
Substring Lấy ra chuỗi con từ chuỗi chính - chuỗi con lấy từ vị trí chỉ ra đến cuối hoặc theo độ dài
string s = stringA.Substring(4); // s = "chào,"
string x = stringA.Substring(0, 3); // s = "Xin" (dài 3)

Sử dụng StringBuilder

Khi sử dụng biến kiểu string để thực hiện các thao tác nhằm mục đích cuối cùng thu được chuỗi theo yêu cầu, trong quá trình đó bạn có thể sử dụng nhiều biến kiểu string, để phục vụ các phép toán như nối chuỗi, tìm kiếm, thay thế ... Mỗi khi khởi tạo một biến kiểu string, bạn đã cấp phát một lượng bộ nhớ để lưu trữ chuỗi - thường thì bộ nhớ này nhiều hơn những gì bạn cần.

Để thi hành tối ưu hơn về tốc độ, về sử dụng bộ nhớ có thể dùng tới đối tượng StringBuilder ở namespace System.Text (thêm vào đầu file using System.Text;)

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Xin chào các bạn - xuanthulab.net");
stringBuilder.Replace("Xin chào", "XIN CHÀO");
Console.WriteLine(stringBuilder); // Out: XIN CHÀO các bạn - xuanthulab.net

Một số phương thức khi sử dụng StringBuilder

method Sử dụng
Append Nối một đối tượng (chuỗi, số ...) vào StringBuilder
AppendFormat Nối vào một chuỗi sinh ra theo StringFormat
Insert Chèn vào StringBuilder một chuỗi ở vị trí chỉ ra
Remove Loại bỏ một lượng ký tự, bắt đầu từ vị trí do chỉ định
Replace Tìm và thay thế
ToString Trả về chuỗi (String)

Dùng biểu thức chính quy với chuỗi trong C#

Khi làm việc với chuỗi, những tác vụ phức tạp muốn nhanh chóng có thể áp dụng kỹ thuật biểu thức chính quy vì C# hỗ trợ các lớp để làm việc với RegExp (regularexpressions), phần này trình bày ở một bài riêng

Ví dụ xây dựng lại hàm tìm kiếm địa chỉ email có trong một văn bản, ví dụ này đã từng xây dựng trong PHP: RegEx tìm email

    String text = @"Đây là địa chỉ
        email userabcguest@xuanthulab.net.vn và
        xyz@gmail.com cần trích xuất";
    String pattern = @"(([^\s.]+)@((.[^\s]+)(\..[^\s]+)))";

    Regex rx = new Regex(pattern);

    // Tìm kiếm.
    MatchCollection matches = rx.Matches(text);
    // In thông báo tìm kiếm.
    Console.WriteLine("Tìm thấy {0} email trong:\n\n  {1}\n\n",
                    matches.Count,
                    text);
    // Xuất kết quả email tìm được
    foreach (Match match in matches)
    {
        GroupCollection groups = match.Groups;
        Console.WriteLine("{0}", groups[0].Value);
    }

Kết quả chạy

Tìm thấy 2 email trong:

  Đây là địa chỉ
                email userabcguest@xuanthulab.net.vn và
                xyz@gmail.com cần trích xuất


userabcguest@xuanthulab.net.vn
xyz@gmail.com

Mã nguồn CS012_String(Git), hoặc tải ex012-1

Đăng ký theo dõi ủng hộ kênh
Mảng (Bài trước)
(Bài tiếp) Tính kế thừa