Еквівалент Java-карти в 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)методу

Відповіді:


181

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

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), дивіться розділ «Зауваження» у словнику <TKey, TValue> 'MSDN на сторінці
canton7

17

Словник <,> - еквівалент. Хоча у нього немає методу Get (...), він має індексовану властивість під назвою Item, до якої ви можете отримати доступ у C # безпосередньо, використовуючи позначення індексу:

class Test {
  Dictionary<int,String> entities;

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

Якщо ви хочете використовувати користувацький тип ключа, то вам слід розглянути можливість впровадження IEquatable <> та переосмислення рівностей (об’єкт) та 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)), якщо ключ не існує.
день
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.