О классе System.Linq.Lookup

Я столкнулся с этим классом, читая книгу С# и задаю несколько вопросов.

  • Почему это добавляется в пространство имен System.Linq, а не в пространство имен Collections?
  • В чем заключается намерение этого класса
  • Почему этот класс не предназначен для прямого экземпляра? Это доступно только через расширение ToLookup, правда?

Ответы

Ответ 1

Назначение класса: словарь, в котором ключ может отображать несколько значений. Подумайте об этом как о группировании, а не о взаимном сопоставлении.

Только через решение ToLookup: Pass. Опять же, кажется, мне плохой звонок. С другой стороны, это означает, что результат неизменен для внешнего мира, что довольно приятно. Очень легко написать собственную коллекцию, которая, конечно же, поддерживает это, но было бы неплохо иметь его в коллекциях "правильно". Я предполагаю, что у MS не было времени/денег, чтобы пройти довольно строгий дизайн/тест, необходимый для принятия решения о выборе первого класса.

Решение пространства имен: Вероятно, связано с вышеизложенным. Наличие версии в System.Collections.Generic, которую вы не могли бы создать, было бы немного странным.

Ответ 2

Отметим, что MiscUtil также включает класс MiscUtil.Linq.EditableLookup<,>, который аналогичен; он реализует обычный интерфейс ILookup<,>, но полностью изменен - ​​поэтому вы можете создать его и добавить свои собственные значения.