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

150

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

class Test {
  Map<Integer,String> entities;

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

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

zmbq
источник

Ответы:

182

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

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

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

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

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

Ресурсы:

Словарь-ключи

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

БЯ
источник
14
Могу также упомянуть TryGetValue.
Даниэль Уорвикер
Это O(lg(n))как Java? Я думаю, что нет
1
@Desolator читает O (1), см. Раздел «Примечания» на странице MSDN словаря <TKey, TValue>
canton7
17

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

class Test {
  Dictionary<int,String> entities;

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

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

Дейв
источник
10
class Test
{
    Dictionary<int, string> entities;

    public string GetEntity(int code)
    {
        // java's 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;
    }
}
LukeH
источник
5
Этот ответ до смешного устарел, но вы можете просто вернуть значение независимо от результата TryGetValue, поскольку valон будет назначен null(то есть default(string)), если ключ не существует.
dlev