Sự khác biệt giữa LINQ ToDictionary và ToLookup là gì


123

Sự khác biệt giữa LINQ ToDictionary và ToLookup là gì? Họ dường như làm điều tương tự.

Câu trả lời:


176

Từ điển là bản đồ 1: 1 (mỗi khóa được ánh xạ tới một giá trị duy nhất) và từ điển có thể thay đổi (có thể chỉnh sửa) sau thực tế.

Tra cứu là một bản đồ 1: nhiều (nhiều bản đồ; mỗi khóa được ánh xạ tới một IEnumerable<>trong các giá trị với khóa đó) và không có thay đổi nào trên ILookup<,>giao diện.

Lưu ý thêm, bạn có thể truy vấn tra cứu (thông qua trình lập chỉ mục) trên một khóa không tồn tại và bạn sẽ nhận được một chuỗi trống. Làm tương tự với từ điển và bạn sẽ nhận được một ngoại lệ.

Vậy: có bao nhiêu bản ghi chia sẻ mỗi khóa?

Một cách quá đơn giản nhìn vào nó là một Lookup<TKey,TValue>xấp xỉ tương đương với mộtDictionary<TKey,IEnumerable<TValue>>


5
Cũng hơi giống với một groupby?
Carlo V. Dango

7
Là hành vi của một tra cứu trả về một chuỗi trống cho một phần quan trọng bị thiếu của hợp đồng tiêu chuẩn ILookup<,>hoặc là một triển khai miễn phí để ném a KeyNotFoundException. Việc thực hiện trong Rx ném a KeyNotFoundException.
Lukazoid

Trong trường hợp nó giúp ích cho bất kỳ ai: Dictionary<TKey, IEnumerable<TValue>>có thể được mô tả như một danh sách từ điển. Vì vậy, ToLookup()cũng giống như nói: cho tôi một từ điển danh sách. Vì một lý do nào đó, việc nghe nó mô tả theo cách đó đã giúp tôi ghi nhớ nó ngay trong đầu.
Nate Cook

-4

ToDictionary là <TKey, TValue> trong khi ToLookup <TKey, T1, T2, T3, ...> tương tự như IGrouping nhưng liệt kê vẫn nằm trong bộ nhớ.


3
Không hoàn toàn chắc chắn những gì bạn đang cố gắng minh họa với T1, T2, T3, ...; ToLookup và ToDictionary (chính các phương thức) có khá nhiều API giống nhau
Marc Gravell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.