コレクション内のアイテムのリストを選択したキーで保持しようとしています。 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)
メソッドがありません
辞書にインデックスを付けることができます。「get」は必要ありませんでした。
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;
}
この方法を使用すると、高速で例外のない値を取得できます(存在する場合)。
リソース:
Dictionary <、>は同等です。 Get(...)メソッドはありませんが、インデックス表記を使用してC#で直接アクセスできるItemというインデックス付きプロパティがあります。
class Test {
Dictionary<int,String> entities;
public String getEntity(int code) {
return this.entities[code];
}
}
カスタムキータイプを使用する場合、デフォルト(参照または構造)の同等性がキーの同等性を判断するのに十分でない限り、IEquatable <>の実装とEquals(object)およびGetHashCode()のオーバーライドを検討する必要があります。また、キーが辞書に挿入された後にキーが変更された場合に奇妙なことが起こるのを防ぐために、キータイプを不変にする必要があります(たとえば、変更によりハッシュコードが変更されたため)。
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;
}
}