Hướng dẫn về Bộ sưu tập C# có ví dụ

⚡ Tóm tắt thông minh

Trong C#, các tập hợp cung cấp một cách linh hoạt để lưu trữ và quản lý các nhóm đối tượng. Không giống như mảng, các tập hợp có thể mở rộng và thu hẹp trong thời gian chạy, và các không gian tên System.Collections và System.Collections.Generic cung cấp các kiểu dữ liệu có sẵn cho danh sách, từ điển, ngăn xếp và hàng đợi.

  • 🔃 Điều chỉnh kích thước linh hoạt: Các tập hợp thêm và xóa các phần tử trong quá trình thực thi, vì vậy bạn không cần phải cố định kích thước trước như mảng.
  • 📚 Không gian tên: System.Collections chứa các kiểu dữ liệu không phải kiểu chung chung, trong khi System.Collections.Generic chứa các kiểu chung chung an toàn về kiểu dữ liệu.
  • 🧱 Các môn học chính: ArrayList, Stack, Queue, Hashtable, SortedList và BitArray đáp ứng các nhu cầu thông thường không mang tính tổng quát.
  • Nguồn điện chung: Các lớp List, Dictionary, HashSet và Queue bổ sung tính an toàn kiểu dữ liệu khi biên dịch và hiệu năng tốt hơn.
  • 🔑 Lựa chọn đúng đắn: Sử dụng Dictionary để tra cứu khóa, List để sắp xếp các mục và Stack hoặc Queue để sắp xếp theo thứ tự LIFO hoặc FIFO.
  • 🤖 Hỗ trợ AI: GitHub Copilot tạo cấu trúc mã cho các bộ sưu tập, và các pipeline của ML.NET truyền dữ liệu thông qua các kiểu bộ sưu tập chung.

Các tập hợp trong C#

Trong hướng dẫn trước, chúng ta đã tìm hiểu về cách sử dụng mảng trong C#. Chúng ta hãy tìm hiểu tổng quan về nó, Mảng trong lập trình được sử dụng để nhóm một tập hợp các đối tượng có liên quan với nhau. Vì vậy, người ta có thể tạo một mảng hoặc một tập hợp các Số nguyên, có thể được truy cập thông qua một tên biến.

Bộ sưu tập trong C# là gì?

Bộ sưu tập tương tự như Mảng, nó cung cấp một cách làm việc linh hoạt hơn với một nhóm đối tượng.

Trong mảng, bạn có thể nhận thấy rằng bạn cần xác định trước số phần tử trong một mảng. Điều này phải được thực hiện khi mảng được khai báo.

Nhưng trong một bộ sưu tập, bạn không cần xác định trước kích thước của bộ sưu tập. Bạn có thể thêm phần tử hoặc thậm chí xóa phần tử khỏi bộ sưu tập bất kỳ lúc nào. Chương này sẽ tập trung vào cách chúng ta có thể làm việc với các bộ sưu tập khác nhau có sẵn trong C#.

Các lớp System.Collections

.NET Framework nhóm các lớp tập hợp không chung chung ban đầu vào trong không gian tên System.Collections. Bảng dưới đây tóm tắt các kiểu chính mà bạn có thể sử dụng ngay lập tức.

Bộ sưu tập Mô tả Chi tiết
Lập danh sách Bộ sưu tập ArrayList tương tự như Arrays kiểu dữ liệu trong C#. Sự khác biệt lớn nhất là tính chất động của bộ sưu tập danh sách mảng.
Sắp xếp Ngăn xếp là một tập hợp đặc biệt thể hiện khái niệm vào sau ra trước (LIFO).
hàng đợi Hàng đợi là một tập hợp dữ liệu đặc biệt thể hiện khái niệm vào trước ra trước.
bảng băm Bảng băm là một tập hợp đặc biệt được sử dụng để lưu trữ các cặp khóa-giá trị.
Danh sách được sắp xếp SortedList là một bộ sưu tập lưu trữ các cặp khóa-giá trị theo thứ tự khóa tăng dần theo mặc định.
BitArray Mảng bit là một mảng cấu trúc dữ liệu lưu trữ các bit.

Các tập hợp chung trong C#

Các lớp không chung chung ở trên lưu trữ mọi phần tử dưới dạng đối tượng chung, điều này có nghĩa là trình biên dịch không thể kiểm tra kiểu và chương trình phải trả một chi phí nhỏ cho việc đóng gói giá trị. Để giải quyết vấn đề này, C# đã thêm không gian tên System.Collections.Generic, trong đó mỗi tập hợp được liên kết với một kiểu được khai báo.

Một tập hợp chung chung như List Chỉ chấp nhận chuỗi ký tự, do đó lỗi được phát hiện trong quá trình biên dịch và không cần ép kiểu khi đọc lại một phần tử. Điều này làm cho các tập hợp chung an toàn hơn, nhanh hơn và dễ đọc hơn, đó là lý do tại sao chúng là lựa chọn mặc định trong mã C# hiện đại.

Các bộ sưu tập chung phổ biến nhất được liệt kê dưới đây:

  • Danh sách : Một danh sách có thể thay đổi kích thước, dựa trên chỉ mục, là sự thay thế chung cho ArrayList.
  • Từ điển : Lưu trữ các cặp khóa-giá trị với khả năng tra cứu nhanh chóng dựa trên hàm băm.
  • HashSet : Chỉ chứa các giá trị duy nhất và hỗ trợ các phép toán tập hợp như phép hợp.
  • Hàng đợi : Một tập hợp dữ liệu vào trước ra trước, phiên bản chung của hàng đợi (Queue).
  • Ngăn xếp : Một kiểu tập hợp vào sau ra trước, phiên bản chung của Stack.
  • Danh sách đã sắp xếp : Sắp xếp các cặp khóa-giá trị theo khóa theo thứ tự tăng dần.

Ví dụ về tập hợp danh sách trong C#

List là kiểu dữ liệu tổng quát được sử dụng rộng rãi nhất vì nó hoạt động giống như một mảng động. Ví dụ dưới đây tạo một danh sách chuỗi, thêm và xóa các phần tử, đọc kích thước của danh sách, sau đó in ra các giá trị còn lại. Toàn bộ mã được viết trong tệp Program.cs.

Bước 1) Nhập không gian tên System.Collections.Generic và khai báo một List các chuỗi.

Bước 2) Thêm mục bằng phương thức Add và xóa mục bằng phương thức Remove.

Bước 3) Đọc thuộc tính Count, sau đó lặp qua danh sách bằng câu lệnh foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Giải trình:-

  1. Không gian tên System.Collections.Generic được nhập khẩu để kiểu dữ liệu List có sẵn cho chương trình.
  2. Một danh sách mới Một thư mục có tên là tutorials được tạo ra, và ba tên được thêm vào bằng phương thức Add.
  3. Phương thức Remove xóa giá trị “Python”, điều này để lại hai mục trong danh sách.
  4. Thuộc tính Count trả về số lượng mục, và vòng lặp foreach sẽ in ra từng giá trị còn lại theo thứ tự.

Khi chương trình chạy, trước tiên nó sẽ in ra số lượng của... 2, theo dõi bởi JavaKotlin trên các dòng riêng biệt. Điều này cho thấy cách một tập hợp thay đổi kích thước của nó trong quá trình chạy, điều mà một mảng cố định không thể làm được.

Sự khác biệt giữa mảng và tập hợp trong C#

Cả hai một mảng và một tập hợp các mục liên quan được nhóm lại dưới một tên duy nhất, nhưng chúng lại hoạt động khác nhau khi chương trình đang chạy. Việc biết khi nào nên sử dụng từng loại sẽ giúp bạn viết mã sạch hơn và hiệu quả hơn.

Những điểm khác biệt chính được liệt kê dưới đây:

  • Kích thước: Mảng có độ dài cố định được thiết lập khi khai báo, trong khi tập hợp có thể tăng hoặc giảm kích thước bất cứ lúc nào.
  • Xử lý kiểu dữ liệu: Mảng lưu trữ một kiểu dữ liệu duy nhất, trong khi tập hợp có thể an toàn về kiểu dữ liệu với kiểu dữ liệu chung (generics) hoặc chứa các đối tượng có kiểu dữ liệu hỗn hợp khi không sử dụng kiểu dữ liệu chung.
  • Vị trí: Mảng được tích hợp sẵn trong ngôn ngữ, trong khi các lớp tập hợp nằm trong không gian tên System.Collections và System.Collections.Generic.
  • Các thao tác tích hợp sẵn: Các tập hợp cung cấp các phương thức sẵn có để thêm, xóa, tìm kiếm và sắp xếp các mục, trong khi mảng chỉ cung cấp khả năng truy cập theo chỉ mục cơ bản.
  • Sử dụng tốt nhất: Hãy chọn mảng khi số lượng phần tử đã biết và cố định, và chọn tập hợp khi số lượng thay đổi trong quá trình chạy chương trình.

Tóm lại, mảng là lựa chọn tốt nhất cho dữ liệu có kích thước cố định, trong khi các tập hợp mang lại sự linh hoạt mà hầu hết các ứng dụng thực tế cần.

Câu Hỏi Thường Gặp

Hãy sử dụng Dictionary khi bạn cần tra cứu nhanh bằng một khóa duy nhất, chẳng hạn như ID được ánh xạ tới một bản ghi. Nó tìm kiếm giá trị trong thời gian gần như không đổi, trong khi List phải quét từng mục một.

HashSet và Dictionary cung cấp khả năng tìm kiếm nhanh nhất vì chúng sử dụng hàm băm để truy cập một phần tử trong thời gian gần như không đổi. List hoặc mảng chậm hơn vì chúng có thể cần kiểm tra từng phần tử theo trình tự.

Các tập hợp đồng thời nằm trong không gian tên System.Collections.Concurrent và được xây dựng cho mã đa luồng. Các kiểu như ConcurrentDictionary và BlockingCollection cho phép nhiều luồng thêm và xóa các mục một cách an toàn mà không cần khóa thủ công.

IEnumerable là giao diện cơ bản chỉ hỗ trợ đọc các phần tử bằng vòng lặp foreach. ICollection mở rộng nó và thêm các thành viên như Count, Add và Remove, do đó nó cũng hỗ trợ sửa đổi tập hợp.

List là một kiểu dữ liệu tổng quát, an toàn về kiểu dữ liệu, lưu trữ một kiểu dữ liệu duy nhất đã được khai báo, giúp kiểm tra lỗi trong quá trình biên dịch và mang lại hiệu suất tốt hơn. ArrayList thì không tổng quát và lưu trữ mọi phần tử dưới dạng đối tượng, cần phải ép kiểu và cho phép sử dụng các kiểu dữ liệu hỗn hợp.

Cấu trúc dữ liệu Stack hoạt động theo nguyên tắc vào sau ra trước (LIFO), vì vậy phần tử mới nhất sẽ được xóa trước bằng lệnh Pop. Cấu trúc dữ liệu Queue hoạt động theo nguyên tắc vào trước ra trước (FIFO), vì vậy phần tử cũ nhất sẽ được xóa trước bằng lệnh Dequeue.

Đúng vậy. GitHub Copilot có thể đề xuất loại tập hợp phù hợp, tạo vòng lặp để thêm hoặc lọc các mục và hoàn thành các truy vấn LINQ từ một đoạn chú thích ngắn, giúp tăng tốc độ làm việc với danh sách, từ điển và các tập hợp khác.

ML.NET cung cấp dữ liệu huấn luyện thông qua các tập hợp như List và IEnumerable, được ánh xạ tới pipeline IDataView của nó. Việc lưu trữ các mẫu trong một tập hợp chung có kiểu dữ liệu mạnh giúp cho quy trình làm việc của máy học trở nên rõ ràng và an toàn về mặt kiểu dữ liệu.

Tóm tắt bài viết này với: