TGViewer
StepOne | Степан Минин StepOne | Степан Минин @steponeit · 3.27K subscribers
Post #261 2.38K
Dictionary vs Lookup

В коммерческой практике часто встречается задача преобразовать некий список в словарь по определённому ключу, чтобы получать элементы коллекции за константное время O(1).

Допустим, у нас есть некоторые сообщения, и требуется возможность выбирать нужное сообщение по отправителю:

record Message(string Sender, string Content);

List<Message> messages = [
new Message(Sender: "Alex", Content: "abc"),
new Message(Sender: "Bob", Content: "123"),
new Message(Sender: "Jim", Content: "=-+")
];


С этим конечно справится метод LINQ ToDictionary:

var messagesBySender = messages
.ToDictionary(x => x.Sender, x => x);


Однако, если в коллекции появится несколько сообщений с одним отправителем:

List<Message> messages = [
new Message(Sender: "Alex", Content: "abc"),
// ...
new Message(Sender: "Alex", Content: "xyz")
];


То мы получим необработанное исключение при выполнении программы:

System.ArgumentException: An item with the same key has already been added. Key: Alex


Как этого избежать? Использовать метод ToLookup, который даже не потребует селектора значения:

var messagesBySender = messages
.ToLookup(x => x.Sender);


В чём вообще разница между этими структурами данных?

Lookup


🔠 Работает за O(1), но возвращает IEnumerable<T>, поскольку одному ключу соответствует несколько значений

🔠 Если записи по ключу не существует, то возвращает пустую коллекцию

🔠 Относится к неизменяемым (immutable) структурам данных

Dictionary


🔠 Работает за O(1), возвращая единственный элемент, соответствующий ключу

🔠 Если записи по ключу не существует, то кидает KeyNotFoundException

🔠 Позволяет обновлять своё состояние
  • 👍 42
  • 🔥 13
  • ❤‍🔥 2
  • ❤ 2
More from @steponeit
  1. Sep 29, 2026Рассказал как автоматизировал сборку лексера компилятором для своего языка программировани…
  2. Sep 28, 2026Пошутил про джавистов в прямом эфире 😅 Шарпизм победил окончательно и бесповоротно!
  3. Sep 27, 2026Post #860
  4. Sep 25, 2026Рассказал как я добавил в HydraScript объекты и методы без классов и сделал протоколы. Стр…
  5. Sep 22, 2026Post #858
  6. Sep 21, 2026Post #857
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →