Dictionary trong C#

Khóa học lập trình C# nâng cao

5.0 (1 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 22:39 26-07-2020 29.090 lượt xem 2 bình luận
Học nhanh

Danh sách bài học

Dictionary trong C#

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về LIST TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Dictionary trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Dictionary là gì?
  • Một số thuộc tính và phương thức hỗ trợ sẵn trong Dictionary.

Dictionary là gì?

Tương tự như List, Dictionary chính là sự thay thế cho Collections Hashtable đã được học. Cho nên về khái niệm hay sử dụng thì Dictionary đều sẽ giống Hashtable.

Dictionary trong C# là một Collections lưu trữ dữ liệu dưới dạng cặp Key - Value. Key đại diện cho 1 khoá giống như chỉ số phần tử của mảng và Value chính là giá trị tương ứng của khoá đó. Ta sẽ dử dụng Key để truy cập đến Value tương ứng.

 Do Dictionary là 1 Generic Collections nên để sử dụng ta cần thêm thư viện System.Collections.Generic bằng câu lệnh:

using System.Collections.Generic;

Vì Dictionary là một lớp nên trước khi sử dụng ta cần khởi tạo vùng nhớ bằng toán tử new:

// khởi tạo 1 Dictionary rỗng với Key và Value đều có kiểu dữ liệu là chuỗi.
Dictionary<string, string> MyHash = new Dictionary<string, string>(); 

Bạn cũng có chỉ định sức chứa (Capacity) ngay lúc khởi tạo bằng cách thông qua constructor được hỗ trợ sẵn:

/* 
 * khởi tạo 1 Dictionary với Key và Value có kiểu chuỗi 
 * đồng thời chỉ định Capacity ban đầu là 5
 */
Dictionary<string, string> MyDic2 = new Dictionary<string, string>(5);
 

Ngoài ra bạn cũng có thể khởi tạo 1 Dictionary chứa các phần tử được sao chép từ một Dictionary khác:

/*
 * Khởi tạo 1 Dictionary có kích thước bằng với MyDic2.
 * Sao chép toàn độ phần tử trong MyDic2 vào MyDic3.
 */
Dictionary<string, string> MyDic3 = new Dictionary<string, string>(MyDic2);

Một số thuộc tính và phương thức hỗ trợ sẵn trong Dictionary

Một số thuộc tính thông dụng trong Dictionary:

  TÊN THUỘC TÍNH  

Ý NGHĨA

Count

  Trả về 1 số nguyên là số phần tử hiện có trong Dictionary.

Keys

  Trả về 1 danh sách chứa các Key trong Dictionary.

Values

  Trả về 1 danh sách chứa các Value trong Dictionary.

Một số phương thức thông dụng trong Dictionary:

TÊN PHƯƠNG THỨC

Ý NGHĨA

  Add(TKey Key, TValue Value)

  Thêm 1 cặp Key - Value vào Dictionary.

  Clear()

  Xoá tất cả các phần tử trong Dictionary.

  ContainsKey(TKey Key)

  Kiểm tra đối tượng Key có tồn tại trong Dictionary hay không.

  ContainsValue(TValue Value)

  Kiểm tra đối tượng Value có tồn tại trong Dictionary hay không.

  Remove(TKey Key)

  Xoá đối tượng có Key xuất hiện đầu tiên trong Dictionary.

  TryGetValue(TKey Key, TValue Value)

  Kiểm tra Key có tồn tại hay không.
  Nếu có sẽ trả về true đồng thời trả về giá trị Value tương ứng qua biến Value.
  Ngược lại trả về false.


Một số lưu ý về Dictionary:

Mỗi một phần tử trong Dictionary (bao gồm 1 cặp Key - Value) được C# định nghĩa là 1 đối tượng có kiểu:

KeyValuePair<TKey, TValue>

Trong đó, có 2 thuộc tính chính:

  •  Key: trả về giá trị Key của phần tử hiện tại.
  •  Value: trả về giá trị Value của phần tử hiện tại.

Điều này tương tự như DictionaryEntry trong Hashtable. Vì thế cách sử dụng cũng tương tự. Ví dụ mình thử dùng foreach duyệt 1 Dictionary và in ra giá trị Key – Value của mỗi phần tử:

// Tạo 1 Dictionary đơn giản và thêm vào 3 phần tử.
Dictionary<string, string> MyDic4 = new Dictionary<string, string>();
MyDic4.Add("FE", "Free Education");
MyDic4.Add("K", "Kteam");
MyDic4.Add("HK", "HowKteam");

/* 
 * Duyệt qua các phần tử trong Dictionary.
 * Vì mỗi phần tử là 1 KeyValuePair nên ta chỉ định kiểu dữ liệu cho item là KeyValuePair luôn.
 * Thử in ra màn hình cặp Key - Value của mỗi phần tử được duyệt.
 */
foreach (KeyValuePair<string, string> item in MyDic4)
{
    Console.WriteLine(item.Key + "\t" + item.Value);
}

Kết quả:

Dictionary trong C#,ContainsKey,ContainsValue,TryGetValue,

Việc truy xuất các phần tử trong Dictionary giống như truy xuất các phần tử mảng nhưng thông qua Key.

Ví dụ:

Console.WriteLine(MyDic4["FE"]);

Trong đó:

  •  MyDic4 là tên của Dictionary.
  •  "FE" là tên Key cần truy xuất. Lưu ý là phải cùng kiểu dữ liệu TKey đã được chỉ định lúc khởi tạo Dictionary.
  •  MyHash["FE"] sẽ lấy ra giá trị Value tương ứng với Key trên.

Khi thao tác với Hashtable nếu như truy xuất đến phần tử có Key không tồn tại sẽ không báo lỗi (chi tiết mình đã trình bày trong bài HASHTABLE TRONG C#) nhưng với Dictionary thì không phải vậy. Nếu ta truy xuất đến Key không tồn tại sẽ nhận được lỗi sau:

Dictionary trong C#,ContainsKey,ContainsValue,TryGetValue,


Khác biệt giữa Dictionary và HashTable trong C#

HASHTABLE

DICTIONARY

Threadsafe - Hỗ trợ multi threading không
  đụng độ tài nguyên

Không hỗ trợ.

Cặp Key - Value lưu kiểu object Phải xác định cụ thể kiểu dữ liệu của cặp Key - value
Truy xuất phần tử không tồn tại trong Hashtable
sẽ không báo lỗi suy ra return null.

Truy xuất phần tử không tồn tại trong Dictionary 
sẽ báo lỗi

Hiệu quả cho dữ liệu lớn Không hiệu quả cho dữ liệu lớn
Các phần tử được sắp xếp lại mỗi khi thêm hoặc xóa
các phần tử trong Hashtable. 
Các phần tử nằm theo thứ tự được thêm vào.
Tìm kiếm nhanh hơn. Tìm kiếm chậm hơn.

Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Dictionary là gì?
  • Sự khác nhau giữa Dictionary và HashTable.
  • Một số thuộc tính và phương thức hỗ trợ sẵn trong Dictionary.

Bài học sau chúng ta sẽ cùng tìm hiểu về TUPLE TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Dictionary trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!

Project

Nếu việc thực hành theo hướng dẫn không diễn ra suôn sẻ như mong muốn. Bạn cũng có thể tải xuống PROJECT THAM KHẢO ở link bên dưới!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Nội dung bài viết

Tác giả/Dịch giả

Khóa học

Khóa học lập trình C# nâng cao

Bạn đã học hết các khoá học về C# CƠ BẢN, LẬP TRÌNH WINFORM thậm chí là LẬP TRÌNH WPF nhưng vẫn bối rối trước những hướng dẫn về CÁC PROJECT THỰC TẾ của Kteam?

Hoặc bạn nghe nói mãi về .NET nhưng vẫn thắc mắc nó có gì hay ho bên trong đó?

Hay đơn giản bạn viết muốn 1 đoạn code cực kỳ nguy hiểm khiến người khác khi nhìn vào phải thốt lên: “Ồ!!!......... Trẻ trâu…”

Khoá học lần này sẽ giúp bạn giải đáp những thắc mắc trên. Chào mừng các bạn đã đến với khoá học Lập trình C# nâng cao của Kteam.

Đánh giá

Nguyen đã đánh giá 19:38 01-03-2019

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
hthecong đã bình luận 15:01 18-06-2018

Dictionary nhanh hơn so với HashTable vì không phải boxing/ unboxing. Tác giả viết như trên là chưa chính xác. Đề nghị hiệu chỉnh lại.

kuroco đã bình luận 14:22 07-03-2018

hi. Mình đọc qua vài mẩu tin trên mạng thì thấy mâu thuẫn với bạn một chút , họ bảo hashtable chậm hơn dictionary.
http://www.c-sharpcorner.com/blogs/difference-between-dictionary-and-hashtable-in-c-sharp
https://www.dotnetperls.com/hashtable
 

Không có video.