Thuộc tính IsReadOnly của ListDictionary cho biết từ điển có ở chế độ chỉ đọc hay không. Giá trị luôn trả về false vì ListDictionary cho phép thêm, xóa, sửa phần tử tự do.
Ví dụ 1: Kiểm tra đầy đủ các thuộc tính
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
ListDictionary dict1 = new ListDictionary();
dict1.Add("A", "Books");
dict1.Add("B", "Electronics");
dict1.Add("C", "Smart Wearables");
dict1.Add("D", "Pet Supplies");
dict1.Add("E", "Clothing");
dict1.Add("F", "Footwear");
Console.WriteLine("Các phần tử của ListDictionary1...");
foreach (DictionaryEntry d in dict1)
{
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("ListDictionary1 có kích thước cố định? = " + dict1.IsFixedSize);
Console.WriteLine("ListDictionary1 chỉ đọc? = " + dict1.IsReadOnly);
Console.WriteLine("ListDictionary1 đồng bộ? = " + dict1.IsSynchronized);
Console.WriteLine("ListDictionary1 có key 'M'? = " + dict1.Contains("M"));
ListDictionary dict2 = new ListDictionary();
dict2.Add("1", "One");
dict2.Add("2", "Two");
dict2.Add("3", "Three");
dict2.Add("4", "Four");
dict2.Add("5", "Five");
dict2.Add("6", "Six");
Console.WriteLine("\nCác cặp key-value của ListDictionary2...");
IDictionaryEnumerator demoEnum = dict2.GetEnumerator();
while (demoEnum.MoveNext())
{
Console.WriteLine("Key = " + demoEnum.Key + ", Value = " + demoEnum.Value);
}
Console.WriteLine("ListDictionary2 có kích thước cố định? = " + dict2.IsFixedSize);
Console.WriteLine("ListDictionary2 chỉ đọc? = " + dict2.IsReadOnly);
Console.WriteLine("ListDictionary2 đồng bộ? = " + dict2.IsSynchronized);
Console.WriteLine("ListDictionary2 có key '5'? = " + dict2.Contains("5"));
}
}
Kết quả
Các phần tử của ListDictionary1... A Books B Electronics C Smart Wearables D Pet Supplies E Clothing F Footwear ListDictionary1 có kích thước cố định? = False ListDictionary1 chỉ đọc? = False ListDictionary1 đồng bộ? = False ListDictionary1 có key 'M'? = False Các cặp key-value của ListDictionary2... Key = 1, Value = One Key = 2, Value = Two Key = 3, Value = Three Key = 4, Value = Four Key = 5, Value = Five Key = 6, Value = Six ListDictionary2 có kích thước cố định? = False ListDictionary2 chỉ đọc? = False ListDictionary2 đồng bộ? = False ListDictionary2 có key '5'? = True
Ví dụ 2: Kiểm tra đơn giản
using System;
using System.Collections;
using System.Collections.Specialized;
public class Demo
{
public static void Main()
{
ListDictionary dict = new ListDictionary();
dict.Add("1", "SUV");
dict.Add("2", "Sedan");
dict.Add("3", "Utility Vehicle");
dict.Add("4", "Compact Car");
dict.Add("5", "SUV");
dict.Add("6", "Sedan");
dict.Add("7", "Utility Vehicle");
dict.Add("8", "Compact Car");
dict.Add("9", "Crossover");
dict.Add("10", "Electric Car");
Console.WriteLine("Các phần tử của ListDictionary...");
foreach (DictionaryEntry d in dict)
{
Console.WriteLine(d.Key + " " + d.Value);
}
Console.WriteLine("\nListDictionary có kích thước cố định? = " + dict.IsFixedSize);
Console.WriteLine("ListDictionary chỉ đọc? = " + dict.IsReadOnly);
Console.WriteLine("ListDictionary đồng bộ? = " + dict.IsSynchronized);
Console.WriteLine("ListDictionary có key 'K'? = " + dict.Contains("K"));
Console.WriteLine("ListDictionary có key '9'? = " + dict.Contains("9"));
}
}
Kết quả
Các phần tử của ListDictionary... 1 SUV 2 Sedan 3 Utility Vehicle 4 Compact Car 5 SUV 6 Sedan 7 Utility Vehicle 8 Compact Car 9 Crossover 10 Electric Car ListDictionary có kích thước cố định? = False ListDictionary chỉ đọc? = False ListDictionary đồng bộ? = False ListDictionary có key 'K'? = False ListDictionary có key '9'? = True
Tóm tắt các thuộc tính chỉ đọc
| Thuộc tính | Giá trị | Ý nghĩa |
|---|---|---|
IsReadOnly |
false |
Có thể thêm/xóa/sửa |
IsFixedSize |
false |
Kích thước động |
IsSynchronized |
false |
Không thread-safe |
Tạo ListDictionary chỉ đọc (Read-only wrapper)
ListDictionary không có sẵn phương thức tạo read-only wrapper. Cách phổ biến:
// Cách 1: Wrapper tùy chỉnh
public class ReadOnlyListDictionary : IDictionary
{
private readonly ListDictionary _inner;
public ReadOnlyListDictionary(ListDictionary inner)
{
_inner = inner ?? throw new ArgumentNullException(nameof(inner));
}
public bool IsReadOnly => true;
public bool IsFixedSize => true;
// Implement IDictionary, ném NotSupportedException cho Add/Remove/Clear
public void Add(object key, object value)
=> throw new NotSupportedException("Collection is read-only");
// ... các method khác
}
// Cách 2: Dùng Dictionary<TKey, TValue> + ReadOnlyDictionary (khuyến nghị)
var dict = new Dictionary<string, string> { { "A", "Apple" } };
var readOnly = new ReadOnlyDictionary<string, string>(dict);
// readOnly.IsReadOnly = true
Lưu ý quan trọng
- ListDictionary đã lỗi thời - dùng
Dictionary<TKey, TValue>cho code mới - Không type-safe (key/value là
object) - Hiệu năng O(n) cho tìm kiếm - chỉ phù hợp < 10 phần tử
- Giữ thứ tự thêm vào (insertion order)
- Namespace:
System.Collections.Specialized
So sánh với Dictionary<TKey, TValue>
// Dictionary hiện đại
var dict = new Dictionary<string, string>();
dict["A"] = "Apple";
// Tạo read-only view
var readOnly = new ReadOnlyDictionary<string, string>(dict);
Console.WriteLine(readOnly.IsReadOnly); // True
// Cố gắng sửa -> NotSupportedException
// readOnly["A"] = "Banana"; // Compile error (indexer chỉ get)
// ((IDictionary)readOnly).Add("B", "Banana"); // Runtime exception