2009-03-26 16 views
140

Koleksiyondaki öğelerin listesini, seçimimin anahtarı ile tutmaya çalışıyorum. Java'da haritayı aşağıdaki gibi kullanırdım:Java eşdeğeri C#

class Test { 
    Map<Integer,String> entities; 

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

C# 'da bunu yapmanın eşdeğer bir yolu var mı? System.Collections.Generic.Hashset karma kullanır yok ve System.Collections.Hashtable 'get'
System.Collections.Generic.Dictionary Dizin Sözlük, sen gerek yoktu bir get(Key) yöntem

cevap

165

olmayan bir jenerik sınıf değil anahtar özel bir türünü tanımlamak olamaz .

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

/almak değerleri test etmek için etkili bir yöntem TryGetValue (Earwicker için teşekkürler) 'dir:

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

bu hızlı yapabilirsiniz yöntemi ve birlikte istisnasız-az (varsa) değerleri olsun.

Kaynaklar:

Dictionary-Keys

Try Get Value

+14

TryGetValue'dan da bahsetmek isteyebilirsiniz. –

+0

Bu, bir Java gibi 'O (lg (n))' dır? Bence –

+1

@Desolator Okumaları O (1), Sözlük adlı kullanıcının Açıklamalar bölümüne bakın. – canton7

17

Sözlük <> eşdeğerdir. Bir özel anahtar türü kullanmak istiyorsanız

class Test { 
    Dictionary<int,String> entities; 

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

: Bir Get olmasa da (...) yöntemi, bu doğrudan indeks notasyonu kullanılarak C# erişebileceği bir endeksli özelliği denilen Öğe var O zaman, varsayılan eşitlik (referans veya yapı) eşitliğinin anahtarların eşitliğini belirlemek için yeterli olmadığı sürece IEquatable <> 'i ve Equals (object) ve GetHashCode() öğesini geçersiz kılmayı düşünmelisiniz. Bir anahtarın bir sözlük içine eklendikten sonra mutasyona uğraması halinde (örneğin mutasyonun kodunun kodunun değişmesine neden olduğu için) tuhaf şeylerin gerçekleşmesini önlemek için anahtar türünüzü değiştiremezsiniz.

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ç bir şekilde eskidir, ancak "TryGetValue" sonucundan bağımsız olarak değeri döndürebilirsiniz, Anahtarın mevcut olmaması durumunda, val (val) 'null' (yani" default (string) ') olarak atanacaktır. – dlev