C#で同等のJava Map


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.Dictionaryget(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についても言及したい場合があります。
Daniel Earwicker 2009年

それO(lg(n))はJavaのようなものですか?私はそうは思いません

1
@Desolator読み取りはO(1)です。Dictionary<TKey、TValue>のMSDNページの注釈セクションを参照してください
canton7

17

Dictionary <、>は同等です。Get(...)メソッドはありませんが、C#でインデックス表記を使用して直接アクセスできるItemというインデックス付きプロパティがあります。

class Test {
  Dictionary<int,String> entities;

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

カスタムキータイプを使用する場合は、IEquatable <>を実装し、デフォルトの(参照または構造体)の等価性がキーの等価性を判断するのに十分でない限り、Equals(object)と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ので、の結果に関係なく値を返すことができます。valnulldefault(string)
dlev、2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.