Чим ILookup<key, value>відрізняється інтерфейс IDictionary<key, value>?
Я не розумію, для чого призначений ILookupінтерфейс.
Чим ILookup<key, value>відрізняється інтерфейс IDictionary<key, value>?
Я не розумію, для чого призначений ILookupінтерфейс.
Відповіді:
ILookupзаписи можуть містити кілька елементів на клавішу - кожна клавіша відображається на IEnumerable<TElement>.
Крім того, як натякається в коментарях, an ILookupє незмінним, тоді як ви можете оновлювати значення в IDictionary(він надає Add()метод та індексатор, що дозволяє отримувати та встановлювати значення).
Підсумовуючи, варіант їх використання дуже різний - ви використовуєте пошук, коли вам потрібна карта 1: N зі значеннями, які є фіксованими і не будуть (і не можуть) змінюватися. З іншого боку, словник пропонує змінне відображення пар значень ключів у співвідношенні 1: 1, тому його можна оновити для додавання або видалення значень.
IEnumerable<T>замість a T.
ILookup<TElement>не є гарантією незмінності. Здається, ваша відповідь натякає на те, що вона є. Це просто забезпечує тільки для читання уявлення про результат пошуку. Крім того, як метод, який приймає, ILookup<TElement>може обробляти зміст вмісту пошуку, залежить від цього методу - і якщо документації немає, безпечніше уникати мутації пошуку, поки зовнішній код все ще посилається на неї та залежно від вашого випадку використання. Подивіться всю дискусію про те, як люди помилково вважають, що впровадження IReadOnlyList<T>повинно означати, що список незмінний.
ILookup<TKey, TElement>це погана ідея, якщо ви плануєте її мутувати. Якщо документів немає, ви зможете припустити, що він відповідає своєму інтерфейсу. Звичайно, реальне життя безладне, але якщо ви створюєте пошук за допомогою одного з ToLookupметодів розширення, слід з упевненістю припустити, що він не буде змінений. Є способи, якими ви могли б, але споживачі ILookup<TKey, TElement>набраних вами членів повинні дотримуватися принципу найменшого здивування. Якщо ви виявили , що був прийнятий той , який мутує в спостережуваному чином throw.
Це набагато простіше, ніж IDictionary. Він використовується Linq. Має лише Contains, Itemі Count. IDictionaryмає Add, Removeі т.д.
IReadOnlyDictionary<TKey, TValue>і всі екземпляри Dictionary<TKey, TValue>класу його реалізують ( ToDictionaryповертає екземпляр класу, тому він теж працює), тому будь-який словник можна виставити як лише для читання.