Эквивалент Java Map в С#

Я пытаюсь содержать список элементов в коллекции с ключом по моему выбору. В Java я просто использовал бы Map следующим образом:

class Test {
  Map<Integer,String> entities;

  public String getEntity(Integer code) {
    return this.entities.get(code);
  }
}

Есть ли эквивалентный способ сделать это в С#? System.Collections.Generic.Hashset не использует хеш, и я не могу определить ключ настраиваемого типа System.Collections.Hashtable не является общим классом System.Collections.Generic.Dictionary не имеет метода get(Key)

Ответ 1

Вы можете индексировать словарь, вам не нужно "получать".

Dictionary<string,string> example = new Dictionary<string,string>();
...
example.Add("hello","world");
...
Console.Writeline(example["hello"]);

Эффективным способом тестирования/получения значений является TryGetValue (thanx to Earwicker):

if (otherExample.TryGetValue("key", out value))
{
    otherExample["key"] = value + 1;
}

С помощью этого метода вы можете быстро и без исключения получать значения (если они есть).

Ресурсы

Dictionary-Keys

Попробуйте получить значение

Ответ 2

Словарь <, > является эквивалентным. Хотя у него нет метода Get (...), он имеет индексированное свойство Item, которое вы можете получить на С# напрямую, используя нотацию индекса:

class Test {
  Dictionary<int,String> entities;

  public String getEntity(int code) {
    return this.entities[code];
  }
}

Если вы хотите использовать собственный тип ключа, вам следует рассмотреть возможность реализации IEquatable < > и переопределения Equals (object) и GetHashCode(), если для определения равенства ключей недостаточно равенства по умолчанию (ссылка или структура). Вы также должны сделать свой ключевой тип неизменным, чтобы предотвратить появление странных вещей, если ключ мутирован после того, как он был вставлен в словарь (например, потому что мутация вызвала изменение его хэш-кода).

Ответ 3

class Test
{
    Dictionary<int, string> entities;

    public string GetEntity(int code)
    {
        // java get method returns null when the key has no mapping
        // so we'll do the same

        string val;
        if (entities.TryGetValue(code, out val))
            return val;
        else
            return null;
    }
}