Эквивалент Java Map в C#: как работать с коллекциями

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам знаком и удобен Map<K, V> из Java и вы ищете аналог в C#, ваш выбор — это Dictionary<TKey, TValue>. Рассмотрим пример:

csharp
Скопировать код
var dictionary = new Dictionary<int, string> { { 1, "one" }, { 2, "two" } };
string value = dictionary[2]; // Вернёт "two"

В C# Dictionary<TKey, TValue> идеально подходит для работы с данными, основанными на парах "ключ-значение", аналогично HashMap из Java.

Кинга Идем в IT: пошаговый план для смены профессии

Безопасное извлечение значений

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

csharp
Скопировать код
if (dictionary.TryGetValue(2, out string result))
{
    Console.WriteLine(result); // Выведет "two".
}

Данный метод упрощает обработку исключений и избавляет от необходимости заранее проверять наличие ключа.

Использование собственных типов данных в качестве ключей

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

  1. Ключи должны быть неизменяемыми, потому что любые изменения могут вызвать ошибки.
  2. Для обеспечения корректной работы операций сравнения и хеширования, рекомендуется реализовать интерфейс IEquatable<T>, а также методы Equals(object) и GetHashCode().

Вот пример пользовательского типа ключа:

csharp
Скопировать код
public class CustomKey : IEquatable<CustomKey>
{
    public readonly int Id;
    public readonly string Name;

    public CustomKey(int id, string name)
    {
        Id = id;
        Name = name;
    }
    
    public bool Equals(CustomKey other)
    {
        return other != null && Id == other.Id && Name == other.Name;
    }
    
    public override int GetHashCode()
    {
        return HashCode.Combine(Id, Name);
    }
}

С помощью такого ключа мы обеспечиваем уникальность и корректное сравнение.

Визуализация

Мы заменям карты на словари, представляя Map из Java как Dictionary в C#:

Java (🗺️): { Key1: 'Value1', Key2: 'Value2', Key3: 'Value3' }

Эквивалент на C#:

C# (📔): new Dictionary<KeyType, ValueType> { { Key1, 'Value1' }, { Key2, 'Value2' }, { Key3, 'Value3' } };

Они оба основаны на концепции пар ключ-значение, но имеют различную реализацию.

🗺️ ➡️ 📔: Map в Java и Dictionary в C# адаптированы для своих языковых экосистем.

Простота добавления и извлечения элементов

Добавление элементов производится с помощью метода Add:

csharp
Скопировать код
dictionary.Add(3, "three");

Доступ к элементам тоже простой:

csharp
Скопировать код
string three = dictionary[3]; // Вернёт "three".

Однако напрямую обращение к элементам может привести к KeyNotFoundException. В таких случаях использование TryGetValue будет более предпочтительным и безопасным.

Неизменяемость ключей и целостность словаря

Менять ключи в уже существующем словаре категорически не рекомендуется:

  • Словари используют хеш-коды ключей, и любые изменения в них могут привести к потере элементов.
  • В итоге, из-за изменения ключей, словарь может "потерять" эти пары или даже испортиться.
  • В идеале, ключи должны быть константными.

Обработка отсутствующих ключей

Метод TryGetValue прекрасно справляется с ситуациями, когда требуется искомый ключ может отсутствовать, опасения о вызове исключения KeyNotFoundException отпадают.

Вот как это выглядит на практике:

csharp
Скопировать код
if (dictionary.TryGetValue(searchKey, out var value))
{
    // Ключ найден, 'value' содержит значение.
}
else
{
    // Ключа нет, 'value' содержит значение по умолчанию для типа.
}

Такой подход избегает нештатных ситуаций и повышает надежность кода.

Полезные материалы

  1. Изучаем Dictionary в C# – Документация Microsoft — детальное описание и примеры использования Dictionary.
  2. Сортировка Map<Key, Value> по значениям – Stack Overflow — как отсортировать Map в Java.
  3. Преимущества Dictionary перед Hashtable в C# – Stack Overflow — сравнение Dictionary и Hashtable в .NET.
  4. Работаем с Dictionary в C# – C# Corner — обзор операций со словарями.
  5. Особенности ConcurrentDictionary – Документация Microsoft — введение в потокобезопасные коллекции в .NET.