0

Bài 7: Collections cơ bản (List và Dictionary) - Phá vỡ giới hạn của Mảng

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

  1. Nhận ra điểm yếu của Mảng cố định và lý do cần dùng Collections.

  2. Sử dụng thành thạo List<T> để quản lý danh sách động (thêm, sửa, xóa linh hoạt).

  3. Sử dụng thành thạo Dictionary<TKey, TValue> để tra cứu dữ liệu siêu tốc theo cặp Khóa - Giá trị (Key - Value).

📖 Phần 1: Tại sao cần Collections?

Ở bài trước, bạn đã học về Mảng (Array). Mảng có một nhược điểm chí mạng: Kích thước cố định. Khi bạn đã tạo một mảng có 5 phần tử (new int[5]), bạn không thể nhồi thêm phần tử thứ 6 vào được nữa. Muốn thêm, bạn phải tạo một mảng mới lớn hơn rồi copy dữ liệu sang (rất tốn công).

Trong thực tế lập trình Backend, dữ liệu đến liên tục và thay đổi kích thước từng giây (người dùng đăng ký mới, sản phẩm được thêm vào giỏ hàng). Lúc này, chúng ta phải dùng Collections (Tập hợp động).

📖 Phần 2: List (Danh sách động)

List giống như một chiếc mảng nhưng có khả năng "co giãn vô hạn". Thích thêm bao nhiêu phần tử cũng được, không cần lo về giới hạn kích thước.

Ký tự <T> (Generics) ở đây đại diện cho kiểu dữ liệu mà List sẽ chứa (vd: List<int>, List<string>).

1. Khởi tạo và Thêm/Xóa phần tử

C#

using System.Collections.Generic; // Bắt buộc phải gọi thư viện này

// Khởi tạo một danh sách chứa chuỗi (tên các học viên)
List<string> students = new List<string>();

// 1. Thêm phần tử vào danh sách (.Add)
students.Add("Hieu");
students.Add("An");
students.Add("Binh");

// 2. Chèn phần tử vào vị trí chỉ định
students.Insert(1, "Cuong"); // "Cuong" sẽ đứng ở vị trí index 1

// 3. Xóa phần tử theo giá trị
students.Remove("An");

// 4. Xóa phần tử theo vị trí (Index)
students.RemoveAt(0); // Xóa phần tử đầu tiên

2. Truy xuất và Duyệt List

C#

List<string> devTeam = new List<string> { "Backend", "Frontend", "DevOps" };

// Lấy phần tử bằng chỉ số (giống mảng)
Console.WriteLine(devTeam[0]); // Backend

// Lấy tổng số lượng phần tử hiện tại (.Count thay vì .Length)
Console.WriteLine($"So luong: {devTeam.Count}"); 

// Duyệt danh sách bằng foreach
foreach (string role in devTeam)
{
    Console.WriteLine($"- {role}");
}

📖 Phần 3: Dictionary<TKey, TValue> (Từ điển tra cứu nhanh)

Hãy tưởng tượng danh bạ điện thoại: Bạn tìm kiếm theo Tên (Key) để ra Số điện thoại (Value). Đó chính là bản chất của Dictionary.

Dictionary lưu trữ dữ liệu dưới dạng Cặp Khóa - Giá trị (Key - Value). Mỗi Key là duy nhất (không được trùng nhau).

1. Khởi tạo và Thêm dữ liệu

C#

using System.Collections.Generic;

// Khởi tạo Dictionary với Key kiểu string (mã sinh viên) và Value kiểu string (tên sinh viên)
Dictionary<string, string> studentMap = new Dictionary<string, string>();

// Thêm dữ liệu (.Add)
studentMap.Add("SV001", "Nguyen Minh Hieu");
studentMap.Add("SV002", "Tran Van An");

// Hoặc khai báo nhanh gọn:
Dictionary<string, double> productPrices = new Dictionary<string, double>()
{
    { "IP15", 20000000 },
    { "MACBOOK", 35000000 }
};

2. Truy xuất và Kiểm tra dữ liệu

C#

// Truy xuất giá trị thông qua Key
Console.WriteLine(productPrices["IP15"]); // 20000000

// Kiểm tra xem Key có tồn tại trước khi lấy để tránh sập app (KeyNotFoundException)
if (productPrices.ContainsKey("MACBOOK"))
{
    Console.WriteLine($"Gia Macbook: {productPrices["MACBOOK"]}");
}

// Duyệt qua Dictionary bằng vòng lặp foreach (mỗi phần tử là một KeyValuePair)
foreach (KeyValuePair<string, double> item in productPrices)
{
    Console.WriteLine($"San pham: {item.Key} - Gia: {item.Value}");
}

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

Viết ứng dụng quản lý giỏ hàng đơn giản sử dụng List để chứa danh sách sản phẩm và Dictionary để lưu giá tiền tương ứng:

C#

using System;
using System.Collections.Generic;

namespace Lesson7
{
    class Program
    {
        static void Main(string[] args)
        {
            // Danh sách các sản phẩm khách đã mua
            List<string> cart = new List<string> { "Laptop", "Mouse", "Keyboard" };

            // Bảng giá niêm yết của từng sản phẩm (Dictionary)
            Dictionary<string, double> priceList = new Dictionary<string, double>()
            {
                { "Laptop", 25000000 },
                { "Mouse", 500000 },
                { "Keyboard", 1200000 },
                { "Monitor", 4000000 }
            };

            double totalMoney = 0;

            Console.WriteLine("--- CHI TIET GIO HANG ---");
            foreach (string item in cart)
            {
                // Kiểm tra xem sản phẩm có trong bảng giá không rồi cộng tiền
                if (priceList.ContainsKey(item))
                {
                    double price = priceList[item];
                    Console.WriteLine($"- {item}: {price:N0} VND");
                    totalMoney += price;
                }
            }

            Console.WriteLine("-------------------------");
            Console.WriteLine($"TONG THANH TOAN: {totalMoney:N0} VND");

            Console.ReadLine();
        }
    }
}

📝 Tóm tắt bài học

  1. List<T>: Danh sách động thay thế cho Mảng, cho phép thêm/sửa/xóa phần tử linh hoạt và dùng thuộc tính .Count để đếm số lượng.

  2. Dictionary<TKey, TValue>: Cấu trúc lưu trữ theo cặp Khóa - Giá trị giúp tra cứu dữ liệu cực nhanh theo Key độc nhất.

  3. Luôn nhớ khai báo thư viện using System.Collections.Generic; khi sử dụng Collections.

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

Yêu cầu: Viết chương trình quản lý từ điển Anh - Việt mini:

  1. Khởi tạo một Dictionary<string, string> chứa ít nhất 4 từ vựng tiếng Anh kèm nghĩa tiếng Việt (vd: "hello" -> "xin chao", "code" -> "ma nguon"...).

  2. Yêu cầu người dùng nhập vào một từ tiếng Anh muốn tra cứu.

  3. Kiểm tra xem từ đó có trong Dictionary không:

    • Nếu có, in ra nghĩa tiếng Việt tương ứng.

    • Nếu không, thông báo "Khong tim thay tu nay trong tu dien!".


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í