2009-03-26 2 views
140

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

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) метод

ответ

165

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

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

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

Ресурсы:

Dictionary-Keys

Try Get Value

+14

Могу также упомянуть TryGetValue. –

+0

Это 'O (lg (n))' как Java один? Я думаю, что не – 2014-03-03 11:02:13

+1

@Desolator Reads - это O (1), см. Раздел «Примечания» в статье «Словарь » – canton7

17

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

class Test { 
    Dictionary<int,String> entities; 

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^