2009-03-26 19 views
140

私は選択したキーでコレクション内のアイテムのリストを保持しようとしています。 Javaでは、次のようにマップを使用します。C#のJavaマップに相当する

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(エリカーにありがとう)である。この方法で

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

あなたが迅速かつ例外のない値(存在する場合)を取得することができます。

資源:

Dictionary-Keys

Try Get Value

+14

TryGetValueについても言及したいと思います。 –

+0

Javaのように 'O(lg(n))'ですか?私はそうではないと思います –

+1

@Desolator ReadsはO(1)です、ディクショナリのMSDNページの備考欄を参照してください。 – canton7

17

辞書<、>と等価です。カスタムキータイプを使用したい場合は

class Test { 
    Dictionary<int,String> entities; 

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

:それは、get(...)メソッドを持っていませんが、それはあなたが直接インデックス表記を使用してC#でアクセスできる項目と呼ばれるインデックス付きプロパティを持っていますIEquatable <>を実装し、Equals(オブジェクト)と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)')に割り当てられるからです。 – dlev