Перейти к содержанию

Как устроен Dictionary в C#

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 оценок, среднее: 5,00 из 5)
Загрузка...

[ Полезный рекламный блок ]

Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.


Dictionary в C# представляет собой структуру данных, которая представляет собой коллекцию пар «ключ-значение». Каждый элемент в Dictionary состоит из уникального ключа и связанного с ним значения. Ключи должны быть уникальными в пределах одного Dictionary.

Dictionary является частью пространства имён System.Collections.Generic.

Dictionary<TKey, TValue> — обобщённый класс, где TKey — тип ключа, а TValue — тип значения. Ключи и значения могут быть практически любого типа, включая встроенные типы данных и пользовательские классы и структуры.

Хэширование ключей

При добавлении элемента в Dictionary, система вычисляет хэш-код для ключа с использованием метода GetHashCode(). Хэш-код — это целочисленное значение, которое служит внутренним индексом для доступа к массиву «ведр» (buckets) хэш-таблицы.

Тип ключа

Тип, используемый в качестве ключа словаря, должен переопределять методы GetHashCode() и Equals() класса Object. Всякий раз, когда класс словаря должен найти местоположение элемента, он вызывает метод GetHashCode(). Целое число, возвращаемое этим методом, используется словарем для вычисления индекса, куда помещен элемент. Мы не станем углубляться в подробности работы этого алгоритма. Единственное, что следует знать — это то, что он использует простые числа, так что емкость словаря всегда выражается простым числом.

Создание и добавление элементов

Создадим новый экземпляр словаря Dictionary с указанием, что ключами будут строки (string), а значениями — целые числа (int):

В этом коде, после определения словаря, добавляется элемент ages. Ключ «Alice» связывается с значением 28. Аналогично предыдущему шагу, добавляется элемент в словарь. Ключ «Bob» связывается с значением 34.

После выполнения этого кода, ages будет содержать три элемента:

Доступ и изменение элементов

Для получения значения по ключу у нас есть 3 варианта, определим следующий словарь:

Первый вариант предполагает использование ключа в индексаторе, если такой ключ отсутствует, вы получите ошибку:

Второй вариант заключается в использовании метода TryGetValue(), который аналогичен тому же int.TryParse():

Если необходимо получить ключ и значение по ключу, можно воспользоваться методами расширения:

Теперь вы знаете, как правильно найти значение в словаре, ни в коем случае не ищите ключ, используя цикл, это операция займет гораздо больше времени.

Проверка наличия элемента

Для проверки наличия элемента в словаре, используйте метод ContainsKey:

Удаление элемента

Для удаления элемента в словаре, используйте метод Remove:

Применение делегатов

Используя словарь и делегат Action, можно вызвать метод по его названию:

Сложность поиска

В среднем случае (при хорошо равномерно распределенных хэш-кодах), поиск, вставка и удаление элементов в Dictionary выполняются за константное время O(1). Однако, в худшем случае, при большом количестве коллизий, время работы может вырасти до O(n), где n — количество элементов в словаре.

Дополнительная информация

1. Record отлично подходит для типа выступающего в качестве ключа для коллекции Dictionary, так как при иммутабельной версии, он переопределяет методы Equals() и GetHashCode().

2. При поиске и сравнении ключей, может потребоваться не учитывать регистр символов, в таком случае можно передать объект StringComparer, в конструктор класса:

Dictionary предоставляет быстрый доступ к элементам по ключу, поэтому он эффективен для поиска и хранения пар «ключ-значение».

Преимущества Dictionary — быстрый доступ к элементам по ключу и эффективное хранение большого количества данных. Однако, они требуют уникальности ключей и могут использовать больше памяти из-за хранения хэш-кодов и значений.

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

Так же вам может быть интересна предыдущая статья — Абстрактный Класс в C#. Места применения.


Вы хотите научится писать код на языке программирования C#?

Создавать различные информационные системы, состоящие из сайтов, мобильных клиентов, десктопных приложений, телеграмм-ботов и т.д.

Переходите к нам на страницу Dijix и ознакомьтесь с условиями обучения, мы специализируемся только на индивидуальных занятиях, как для начинающих, так и для более продвинутых программистов. Вы можете взять как одно занятие для проработки интересующего Вас вопроса, так и несколько, для более плотной работы. Благодаря личному кабинету, каждый студент повысит качество своего обучения, в вашем распоряжении:

  • Доступ к пройденному материалу
  • Тематические статьи
  • Библиотека книг
  • Онлайн тестирование
  • Общение в закрытых группах

https://dijix.com.ua

Живи в своем мире, программируй в нашем.


 

Опубликовано в рубрикеЯзык Программирования C#
Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Pergivod1
Pergivod1
11 месяцев назад

Понятно что еще учить и учить мне..

1
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x