Bài 1: Giới thiệu về Trình quản lý quảng cáo

BÀI GIẢNG C#: COLLECTIONS VÀ DANH SÁCH (LIST)

1. Giới thiệu về Collections trong C#

Trong C#, Collections là tập hợp các đối tượng có thể lưu trữ và quản lý dữ liệu một cách linh hoạt. Một trong những kiểu phổ biến nhất là List<T>, cung cấp các phương thức mạnh mẽ để thao tác với dữ liệu.


2. List trong C#

2.1. List là gì?

  • List<T> là một danh sách động, có thể chứa các phần tử của một kiểu dữ liệu cụ thể (T).
  • Không giống như mảng (array), List<T> có thể tự động thay đổi kích thước khi thêm hoặc xóa phần tử.

👉 Cú pháp khai báo:

List<T> tenDanhSach = new List<T>();

Ví dụ với kiểu int:

List<int> numbers = new List<int>();

Ví dụ với kiểu string:

List<string> names = new List<string>();

2.2. Thêm phần tử vào List

Dùng phương thức Add() để thêm một phần tử vào danh sách.

List<int> numbers = new List<int>();
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);

Console.WriteLine(string.Join(", ", numbers));  // Output: 10, 20, 30

Thêm nhiều phần tử cùng lúc bằng AddRange()

List<int> moreNumbers = new List<int> { 40, 50, 60 };
numbers.AddRange(moreNumbers);

Console.WriteLine(string.Join(", ", numbers));  // Output: 10, 20, 30, 40, 50, 60

2.3. Truy cập phần tử trong List

  • Truy cập theo chỉ mục:
Console.WriteLine(numbers[1]);  // Output: 20
  • Duyệt danh sách bằng foreach
foreach (var num in numbers)
{
    Console.Write(num + " ");  // Output: 10 20 30 40 50 60
}
  • Duyệt danh sách bằng for
for (int i = 0; i < numbers.Count; i++)
{
    Console.Write(numbers[i] + " ");
}

📌 Count dùng để lấy số lượng phần tử trong danh sách.

2.4. Cập nhật phần tử trong List

Thay đổi giá trị tại một vị trí cụ thể:

numbers[1] = 25;
Console.WriteLine(string.Join(", ", numbers));  // Output: 10, 25, 30, 40, 50, 60

2.5. Xóa phần tử khỏi List

  • Xóa phần tử theo giá trị:
numbers.Remove(25);  
Console.WriteLine(string.Join(", ", numbers));  // Output: 10, 30, 40, 50, 60
  • Xóa phần tử theo vị trí:
numbers.RemoveAt(0);  
Console.WriteLine(string.Join(", ", numbers));  // Output: 30, 40, 50, 60
  • Xóa tất cả phần tử:
numbers.Clear();
Console.WriteLine(numbers.Count);  // Output: 0

2.6. Tìm kiếm trong List

  • Kiểm tra xem phần tử có tồn tại không (Contains)
if (numbers.Contains(40))
    Console.WriteLine("Danh sách có chứa số 40");
  • Tìm vị trí phần tử (IndexOf)
int index = numbers.IndexOf(50);
Console.WriteLine(index);  // Output: 2
  • Tìm phần tử thỏa điều kiện (Find)
int result = numbers.Find(x => x > 30);
Console.WriteLine(result);  // Output: 40
  • Tìm tất cả phần tử thỏa điều kiện (FindAll)
List<int> greaterThan30 = numbers.FindAll(x => x > 30);
Console.WriteLine(string.Join(", ", greaterThan30));  // Output: 40, 50, 60

2.7. Sắp xếp List

  • Sắp xếp tăng dần (Sort)
numbers.Sort();
Console.WriteLine(string.Join(", ", numbers));  
  • Sắp xếp giảm dần
numbers.Sort((a, b) => b.CompareTo(a));
Console.WriteLine(string.Join(", ", numbers));  
  • Đảo ngược danh sách (Reverse)
numbers.Reverse();
Console.WriteLine(string.Join(", ", numbers));  


3. Các thao tác với List đối tượng

3.1. Thêm đối tượng vào List

Có 2 cách để thêm đối tượng vào danh sách:

Cách 1: Dùng Add() để thêm từng sinh viên

danhSachSinhVien.Add(new SinhVien(1, "Nguyễn Văn A", 8.5));
danhSachSinhVien.Add(new SinhVien(2, "Trần Thị B", 7.2));
danhSachSinhVien.Add(new SinhVien(3, "Lê Văn C", 9.0));

Cách 2: Dùng AddRange() để thêm nhiều sinh viên cùng lúc

danhSachSinhVien.AddRange(new List<SinhVien>
{
    new SinhVien(4, "Phạm Thị D", 6.8),
    new SinhVien(5, "Hoàng Văn E", 7.5)
});

3.2. Hiển thị danh sách sinh viên

Duyệt danh sách bằng vòng lặp foreach:

foreach (SinhVien sv in danhSachSinhVien)
{
    sv.HienThi();
}

👉 Output:

ID: 1, Họ tên: Nguyễn Văn A, Điểm: 8.5
ID: 2, Họ tên: Trần Thị B, Điểm: 7.2
ID: 3, Họ tên: Lê Văn C, Điểm: 9.0
ID: 4, Họ tên: Phạm Thị D, Điểm: 6.8
ID: 5, Họ tên: Hoàng Văn E, Điểm: 7.5

3.3. Tìm kiếm trong List đối tượng

🔹 Tìm sinh viên theo ID (Find())

SinhVien svTim = danhSachSinhVien.Find(sv => sv.ID == 2);
if (svTim != null)
    svTim.HienThi();
else
    Console.WriteLine("Không tìm thấy sinh viên.");

👉 Output:

ID: 2, Họ tên: Trần Thị B, Điểm: 7.2

🔹 Tìm tất cả sinh viên có điểm >= 8 (FindAll())

List<SinhVien> svGioi = danhSachSinhVien.FindAll(sv => sv.Diem >= 8);
Console.WriteLine("Danh sách sinh viên giỏi:");
foreach (SinhVien sv in svGioi)
{
    sv.HienThi();
}

👉 Output:

Danh sách sinh viên giỏi:
ID: 1, Họ tên: Nguyễn Văn A, Điểm: 8.5
ID: 3, Họ tên: Lê Văn C, Điểm: 9.0

3.4. Cập nhật thông tin trong List

Giả sử cần cập nhật điểm của sinh viên có ID = 3:

SinhVien svUpdate = danhSachSinhVien.Find(sv => sv.ID == 3);
if (svUpdate != null)
{
    svUpdate.Diem = 9.5;
    Console.WriteLine("Cập nhật thành công!");
    svUpdate.HienThi();
}

👉 Output:

Cập nhật thành công!
ID: 3, Họ tên: Lê Văn C, Điểm: 9.5

3.5. Xóa phần tử khỏi List

🔹 Xóa theo ID

danhSachSinhVien.RemoveAll(sv => sv.ID == 2);
Console.WriteLine("Danh sách sau khi xóa sinh viên có ID = 2:");
foreach (SinhVien sv in danhSachSinhVien)
{
    sv.HienThi();
}

👉 Output: (Sinh viên có ID = 2 đã bị xóa)

ID: 1, Họ tên: Nguyễn Văn A, Điểm: 8.5
ID: 3, Họ tên: Lê Văn C, Điểm: 9.5
ID: 4, Họ tên: Phạm Thị D, Điểm: 6.8
ID: 5, Họ tên: Hoàng Văn E, Điểm: 7.5

3.6. Sắp xếp List đối tượng

🔹 Sắp xếp theo điểm tăng dần

danhSachSinhVien.Sort((a, b) => a.Diem.CompareTo(b.Diem));
Console.WriteLine("Danh sách sau khi sắp xếp theo điểm:");
foreach (SinhVien sv in danhSachSinhVien)
{
    sv.HienThi();
}

🔹 Sắp xếp theo điểm giảm dần

danhSachSinhVien.Sort((a, b) => b.Diem.CompareTo(a.Diem));


4. Tổng kết

Phương thức Chức năng
Add(T item) Thêm phần tử vào List
AddRange(IEnumerable<T>) Thêm nhiều phần tử
Remove(T item) Xóa phần tử theo giá trị
RemoveAt(int index) Xóa phần tử theo chỉ mục
Clear() Xóa toàn bộ danh sách
Contains(T item) Kiểm tra phần tử có tồn tại không
IndexOf(T item) Tìm vị trí phần tử
Find(Predicate<T>) Tìm phần tử đầu tiên thỏa mãn điều kiện
FindAll(Predicate<T>) Tìm tất cả phần tử thỏa mãn điều kiện
Sort() Sắp xếp danh sách
Reverse() Đảo ngược danh sách

 

Viết chương trình C# để quản lý danh sách nhân viên trong công ty bằng List<NhanVien>.

1. Yêu cầu:

  1. Tạo lớp NhanVien với các thuộc tính:

    • ID (int) – Mã nhân viên.
    • HoTen (string) – Họ và tên.
    • Luong (double) – Mức lương.
    • Hàm HienThi() để in thông tin nhân viên.
  2. Chương trình chính (Main) thực hiện các chức năng:

    • Thêm nhân viên vào danh sách.
    • Hiển thị danh sách nhân viên.
    • Tìm kiếm nhân viên theo ID.
    • Cập nhật thông tin nhân viên.
    • Xóa nhân viên theo ID.
    • Sắp xếp danh sách theo lương giảm dần.

2. Nộp bài: file cs học viết trực tiếp trong phần trả lời