C # 'da Java Harita eşdeğeri


150

Seçtiğim bir anahtarla bir koleksiyondaki öğelerin listesini tutmaya çalışıyorum. Java, ben sadece Harita aşağıdaki gibi kullanabilirsiniz:

class Test {
  Map<Integer,String> entities;

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

Bunu C # ile eşdeğer bir yolu var mı? System.Collections.Generic.Hashsetkarma kullanmıyor ve özel bir tür anahtarı tanımlayamıyorum System.Collections.Hashtable, genel bir sınıfın
System.Collections.Generic.Dictionarybir get(Key)yöntemi yok

Yanıtlar:


181

Sözlüğü indeksleyebilirsiniz, 'get'e ihtiyacınız yoktu.

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

Değerleri test etmenin / almanın etkili bir yolu TryGetValue(thanw - Earwicker):

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

Bu yöntemle değerleri (varsa) hızlı ve istisnasız olarak alabilirsiniz.

Kaynaklar:

Sözlük-Tuşlar

Değer Almayı Deneyin


14
TryGetValue'dan da bahsetmek isteyebilir.
Daniel Earwicker

Öyle mi O(lg(n))Java biri gibi mi? Sanmıyorum

1
@Desolator Okumaları O (1), Sözlük <TKey, TValue> 'in MSDN sayfasının Açıklamalar bölümüne bakın
canton7

17

Sözlük <,> eşdeğerdir. Get (...) yöntemine sahip olmasa da, Öğe adında, dizin gösterimini kullanarak doğrudan C # 'de erişebileceğiniz dizinlenmiş bir özelliği vardır:

class Test {
  Dictionary<int,String> entities;

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

Özel bir anahtar türü kullanmak istiyorsanız, varsayılan (başvuru veya yapı) eşitliği anahtarların eşitliğini belirlemek için yeterli olmadıkça IEquatable <> 'ı uygulamayı ve Equals (object) ve GetHashCode () değerlerini geçersiz kılmayı düşünmelisiniz. Ayrıca, bir anahtarın sözlüğe eklendikten sonra mutasyona uğraması durumunda garip şeylerin olmasını önlemek için anahtar türünüzü değiştirilemez hale getirmelisiniz (örneğin, mutasyon karma kodunun değişmesine neden olduğu için).


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
Bu cevap gülünç derecede eski, ancak sonucundan bağımsız olarak sadece değer döndürebilirsiniz TryGetValue, çünkü anahtar yoksa valatanacaktır null(yani default(string)).
dlev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.