Khi ngoại lệ không phải là một tùy chọn, hãy đi Tra cứu
Nếu bạn đang cố gắng để có được một cấu trúc hiệu quả như một Dictionary
nhưng bạn không biết chắc chắn rằng không có khóa trùng lặp trong đầu vào, Lookup
thì an toàn hơn.
Như đã đề cập trong một câu trả lời khác, nó cũng hỗ trợ các khóa null và luôn trả về kết quả hợp lệ khi được truy vấn với dữ liệu tùy ý, do đó, nó có vẻ linh hoạt hơn với đầu vào không xác định (ít bị hơn so với Từ điển để đưa ra ngoại lệ).
Và nó đặc biệt đúng nếu bạn so sánh nó với System.Linq.Enumerable.ToDictionary
hàm:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
Thay thế sẽ là viết mã quản lý khóa trùng lặp của riêng bạn bên trong một foreach
vòng lặp.
Cân nhắc hiệu suất, Từ điển: một người chiến thắng rõ ràng
Nếu bạn không cần một danh sách và bạn sẽ quản lý một số lượng lớn các mặt hàng, Dictionary
(hoặc thậm chí cấu trúc tùy chỉnh của riêng bạn) sẽ hiệu quả hơn:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Vì Lookup
phải duy trì một danh sách các mục cho mỗi khóa, nó chậm hơn Từ điển (chậm hơn khoảng 3 lần đối với số lượng lớn các mục)
Tốc độ tra cứu: Tạo: 00: 00: 01.5760444
Tốc độ từ điển: Tạo: 00: 00: 00.4418833