0

Bài 3: Toán tử và Xử lý chuỗi (String, StringBuilder)

🎯 Mục tiêu bài học

  1. Nắm vững các phép toán số học, logic và so sánh cốt lõi.

  2. Thao tác cắt, ghép, và định dạng chuỗi (String).

  3. Hiểu bản chất cấp phát bộ nhớ của String và biết khi nào phải dùng StringBuilder để tối ưu hiệu suất (cực kỳ quan trọng với Backend).

📖 Phần 1: Các Toán tử (Operators) cơ bản

C# hỗ trợ đầy đủ các toán tử giống như hầu hết các ngôn ngữ C-family khác:

  • Toán tử số học: +, -, *, /, % (chia lấy dư).

    • Lưu ý: Nếu bạn chia hai số nguyên (vd: 5 / 2), kết quả C# trả về là 2 (bị ép về nguyên). Để ra 2.5, ít nhất một số phải là số thực (vd: 5.0 / 2).
  • Toán tử tăng/giảm: ++ (cộng thêm 1), -- (trừ đi 1).

  • Toán tử so sánh: == (bằng), != (khác), >, <, >=, <=. Kết quả luôn trả về bool (true/false).

  • Toán tử logic: && (VÀ), || (HOẶC), ! (PHỦ ĐỊNH).

    • Cơ chế Short-circuit: Trong phép A && B, nếu A sai, C# sẽ bỏ qua không kiểm tra B nữa để tiết kiệm tài nguyên.

📖 Phần 2: Xử lý Chuỗi (String)

Chuỗi (string) là kiểu dữ liệu bạn sẽ thao tác nhiều nhất khi làm việc với API, Database hoặc xử lý file.

1. Ghép chuỗi và String Interpolation

Như đã giới thiệu ở bài trước, thay vì dùng dấu + để ghép chuỗi rất rối mắt, hãy luôn ưu tiên dùng String Interpolation (dấu $).

C#

string framework = "ASP.NET Core";
int version = 8;
// Cách hiện đại và dễ đọc nhất:
string message = $"Toi dang hoc {framework} phien ban {version}";

2. Các hàm xử lý chuỗi phổ biến

C# cung cấp sẵn các phương thức cực mạnh để thao tác với chuỗi:

C#

string text = "  Backend Developer  ";

// 1. Xóa khoảng trắng thừa ở 2 đầu
string trimmed = text.Trim(); // "Backend Developer"

// 2. Chuyển hoa/thường (Rất hữu ích khi tìm kiếm không phân biệt hoa thường)
string upper = trimmed.ToUpper(); // "BACKEND DEVELOPER"
string lower = trimmed.ToLower(); // "backend developer"

// 3. Thay thế chuỗi
string replaced = trimmed.Replace("Backend", "Fullstack"); // "Fullstack Developer"

// 4. Kiểm tra chuỗi có chứa từ khóa không
bool hasDev = trimmed.Contains("Dev"); // true

// 5. Cắt chuỗi thành mảng dựa trên ký tự
string data = "1;Nguyen;2004";
string[] parts = data.Split(';'); // Tạo ra mảng 3 phần tử: "1", "Nguyen", "2004"

📖 Phần 3: Tránh lỗi "Tràn RAM" với StringBuilder

Đây là kiến thức phân biệt một coder nghiệp dư và một Backend Developer thực thụ. Trong C#, String là kiểu dữ liệu bất biến (Immutable). Nghĩa là một khi chuỗi được tạo ra, nó không thể thay đổi. Mỗi lần bạn dùng toán tử + hoặc += để nối thêm nội dung vào chuỗi, C# sẽ tạo ra một vùng nhớ hoàn toàn mới, copy chuỗi cũ sang, cộng chuỗi mới vào, rồi dọn rác vùng nhớ cũ.

Nếu bạn nối chuỗi 10.000 lần trong một vòng lặp, CPU và RAM sẽ phải làm việc cực nhọc, gây sụt giảm hiệu năng nghiêm trọng.

Giải pháp: Dùng StringBuilder StringBuilder cấp phát sẵn một vùng nhớ trống và cho phép bạn nhét thêm dữ liệu vào đó mà không cần tạo mới.

C#

using System.Text; // Phải gọi thư viện này

// Khởi tạo StringBuilder
StringBuilder sb = new StringBuilder();

// Thêm dữ liệu vào đuôi
sb.Append("Select * ");
sb.Append("FROM Users ");
sb.Append("WHERE Age > 18");

// Khi nào cần dùng kết quả cuối cùng mới xuất ra string
string finalQuery = sb.ToString(); 

Nguyên tắc: Khi cần nối chuỗi dưới 5 lần, dùng string hoặc nội suy $"". Khi nối chuỗi trong vòng lặp hoặc nối số lượng lớn dữ liệu, bắt buộc dùng StringBuilder.

💻 Phần 4: Thực hành

Mở editor và chạy thử đoạn mã làm sạch dữ liệu đầu vào sau đây:

C#

using System;
using System.Text; // Thư viện cho StringBuilder

namespace Lesson3
{
    class Program
    {
        static void Main(string[] args)
        {
            // Tình huống: Người dùng nhập username rất cẩu thả
            string rawInput = "   hieu.Nguyen2004   ";
            
            // Bước 1: Cắt khoảng trắng 2 đầu và đưa về chữ thường
            string cleanInput = rawInput.Trim().ToLower();
            
            Console.WriteLine($"Du lieu tho: '{rawInput}'");
            Console.WriteLine($"Du lieu sach: '{cleanInput}'");

            // Bước 2: Dùng StringBuilder tạo một mã đăng nhập
            StringBuilder tokenBuilder = new StringBuilder();
            tokenBuilder.Append("USER_");
            tokenBuilder.Append(cleanInput);
            tokenBuilder.Append("_ACTIVE");

            Console.WriteLine($"Token sinh ra: {tokenBuilder.ToString()}");
            
            Console.ReadLine();
        }
    }
}

🛠 Bài tập thực hành

Yêu cầu: Xử lý một đoạn mã lỗi được gửi từ hệ thống. Bạn có một chuỗi log như sau: string logData = "ERROR: Database timeout | IP: 192.168.1.1";

  1. Hãy tách chuỗi này ra thành 2 phần, sử dụng ký tự | làm điểm cắt. (Dùng hàm Split).

  2. Thay thế từ ERROR thành WARNING ở phần đầu tiên.

  3. In ra màn hình phần tử IP bằng cách cắt bỏ chữ IP: thừa đi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí