Чим відрізняється LINQ ToDictionary від ToLookup? Вони ніби роблять те саме.
Чим відрізняється LINQ ToDictionary від ToLookup? Вони ніби роблять те саме.
Відповіді:
Словник - це карта 1: 1 (кожен ключ відображається в одному значенні), а словник може змінюватися (редагуватися) після факту.
Пошук - це мапа 1: багато (мульти-карта; кожен ключ відображається до IEnumerable<>
значень за допомогою цього ключа), і в ILookup<,>
інтерфейсі немає мутації .
Як бічна примітка, ви можете запитувати пошук (через індексатор) на ключ, який не існує, і ви отримаєте порожню послідовність. Зробіть те саме зі словником, і ви отримаєте виняток.
Отже: скільки записів поділяє кожен ключ?
Надмірно спрощений спосіб дивитися на нього в тому , що Lookup<TKey,TValue>
це приблизно порівнянні з аDictionary<TKey,IEnumerable<TValue>>
ILookup<,>
або це реалізація, вільна для кидання KeyNotFoundException
. Реалізація в Rx кидає KeyNotFoundException
.
Dictionary<TKey, IEnumerable<TValue>>
його можна описати як словник списків. Так ToLookup()
, як сказати: дайте мені словник списків. Чомусь слухаючи це описано, це допомогло мені зрозуміти це прямо в голові.
ToDictionary є <TKey, TValue>, а ToLookup <TKey, T1, T2, T3, ...> схожий на IGrouping, але перерахування залишається в пам'яті.
T1, T2, T3, ...
; ToLookup і ToDictionary (самі методи) мають майже однаковий API