День сто сороковой. #ЗаметкиНаПолях

Коллекции в C#

1. Словарь Dictionary<TKey, TValue>

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

При хранении или извлечении объекта в словаре необходимо указать ключ. Ключ - это значение, которое однозначно идентифицирует объект и не может быть null. Например, чтобы сохранить объект Customer в словаре, вы можете использовать CustomerID в качестве ключа.

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

var dictionary = new Dictionary<int, Customer>();

dictionary.Add(customer.Id, customer);



// Получаем клиента с ID 1234

var customer = dictionary[1234];



Наиболее полезные методы и свойства:

// Удаление элемента по ключу 

dictionary.Remove(1);

// Очистка словаря

dictionary.Clear();

// Количество элементов

var count = dictionary.Count;

// Проверка на вхождение ключа

var containsKey = dictionary.ContainsKey(1);

// Проверка на вхождение значения

var containsValue = dictionary.ContainsValue(customer1);

// Итерация по ключам

foreach (var key in dictionary.Keys)

Console.WriteLine(dictionary[key]);

// Итерация по значениям

foreach (var value in dictionary.Values)

Console.WriteLine(value);

// Итерация по парам ключ-значение

foreach (var keyValuePair in dictionary)

{

Console.WriteLine(keyValuePair.Key);

Console.WriteLine(keyValuePair.Value);

}



Почему поиск в словаре так быстр? Словарь хранит объекты в массиве, но в отличие от списка, в котором объекты добавляются в конец массива (или по указанному индексу), индекс в словаре вычисляется с использованием хеш-функции. При сохранении объекта в словаре, вычисляется хеш ключа с помощью функции GetHashCode. Затем хэш корректируется под размер массива, чтобы вычислить индекс. При поиске объекта по ключу, метод GetHashCode снова используется для вычисления хеша и индекса. Поэтому, в отличие от списков, поиск объекта в словаре не требует сканирования каждого объекта и независимо от того, насколько велик словарь, он останется чрезвычайно быстрым.



Источник: https://programmingwithmosh.com/net/csharp-collections/