Эквивалент 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)метода

Ответы:


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;
    }
}

5
Этот ответ до смешного устарел, но вы можете просто вернуть значение независимо от результата TryGetValue, поскольку valон будет назначен null(то есть default(string)), если ключ не существует.
dlev
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.