Эквивалент Java Map в C # - PullRequest
146 голосов
/ 27 марта 2009

Я пытаюсь сохранить список предметов в коллекции с ключом на мой выбор. В 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) метода

Ответы [ 3 ]

176 голосов
/ 27 марта 2009

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

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

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

Ресурсы:

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

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

17 голосов
/ 27 марта 2009

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

class Test {
  Dictionary<int,String> entities;

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

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

10 голосов
/ 27 марта 2009
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;
    }
}
...