Інтерфейс ILookup проти IDictionary


75

Чим ILookup<key, value>відрізняється інтерфейс IDictionary<key, value>?

Я не розумію, для чого призначений ILookupінтерфейс.


6
Підтримка «багатокартовості» - це перше, що спадає на думку (одним ключем можна зіставити набір значень).

Можливий дублікат "У чому сенс пошуку <TKey, TElement>? ".
Уве Кейм

Відповіді:


111

ILookupзаписи можуть містити кілька елементів на клавішу - кожна клавіша відображається на IEnumerable<TElement>.

Крім того, як натякається в коментарях, an ILookupє незмінним, тоді як ви можете оновлювати значення в IDictionary(він надає Add()метод та індексатор, що дозволяє отримувати та встановлювати значення).

Підсумовуючи, варіант їх використання дуже різний - ви використовуєте пошук, коли вам потрібна карта 1: N зі значеннями, які є фіксованими і не будуть (і не можуть) змінюватися. З іншого боку, словник пропонує змінне відображення пар значень ключів у співвідношенні 1: 1, тому його можна оновити для додавання або видалення значень.


1
Дійсно, кожен запис є IEnumerable<T>замість a T.
Гейб

1
+1 Хоча це правда, було б непогано мати більше про різницю в інтерфейсі, змінності

Впровадження ILookup<TElement>не є гарантією незмінності. Здається, ваша відповідь натякає на те, що вона є. Це просто забезпечує тільки для читання уявлення про результат пошуку. Крім того, як метод, який приймає, ILookup<TElement>може обробляти зміст вмісту пошуку, залежить від цього методу - і якщо документації немає, безпечніше уникати мутації пошуку, поки зовнішній код все ще посилається на неї та залежно від вашого випадку використання. Подивіться всю дискусію про те, як люди помилково вважають, що впровадження IReadOnlyList<T>повинно означати, що список незмінний.
binki

1
@binki Виставляти мутабельну реалізацію, ILookup<TKey, TElement>це погана ідея, якщо ви плануєте її мутувати. Якщо документів немає, ви зможете припустити, що він відповідає своєму інтерфейсу. Звичайно, реальне життя безладне, але якщо ви створюєте пошук за допомогою одного з ToLookupметодів розширення, слід з упевненістю припустити, що він не буде змінений. Є способи, якими ви могли б, але споживачі ILookup<TKey, TElement>набраних вами членів повинні дотримуватися принципу найменшого здивування. Якщо ви виявили , що був прийнятий той , який мутує в спостережуваному чином throw.
Алуан Хаддад,

1
Граматична помилка в моєму коментарі: я маю на увазі, що ваші споживачі повинні мати змогу вважати, що ви дотримувались принципу найменшого здивування.
Алуан Хаддад

4

Це набагато простіше, ніж IDictionary. Він використовується Linq. Має лише Contains, Itemі Count. IDictionaryмає Add, Removeі т.д.


Ви маєте на увазі, що ILookup - це лише для читання підмножина IDictionary?
Тімоті Суон

1
Начебто ... Але кожен елемент - це IGrouping, тому для одного ключа може бути кілька елементів, щоб він не мав належного відображення. Мені було б приємно мати інтерфейс лише для читання словника.
Філіпп

2
@Philippe Інтерфейс словника, призначений лише для читання, є, IReadOnlyDictionary<TKey, TValue>і всі екземпляри Dictionary<TKey, TValue>класу його реалізують ( ToDictionaryповертає екземпляр класу, тому він теж працює), тому будь-який словник можна виставити як лише для читання.
Los Frijoles

1
@LosFrijoles Дякую, я не знав, що цей існує. На даний момент я застряг у .NET 4.0 і неправильно припустив, що він не існував без перевірки на MSDN.
Філіпп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.