2

がクラスですIDictionary<TKey, TValue>。の代わりに値TKeyを使用してインデクサーを使用する機能を追加できますか?StringTKey

public class MyClass {
  public string Name { get; set; }
}

....

//dict is a IDictionary<MyClass, object> 
dict.Add(new MyClass { Name = "Foo" });

現在、私はLinqを使用して値にアクセスしていますが、次のNameようなものを好みます:

//This call returns the variable I added above
object value = dict["Foo"];

これは可能ですか?

4

2 に答える 2

3

クラスに基づいて独自の辞書クラスを作成できます。

public class MyClass
{
    public string Name { get; set; }

    // You may want to implement equality members on your class so that 
    // the dictionary treats the Name value as the key correctly.
}

public class MyClassDictionary<TValue> : Dictionary<MyClass, TValue>
{
    public TValue this[string val]
    {
        get
        {
            return base[Keys.First(x => x.Name == val)];
        }
    }
}

その後、必要に応じてこれを使用できます。

MyClassDictionary<string> instance = new MyClassDictionary<string>();

instance.Add(new MyClass() { Name = "testkey" }, "test value");

Debug.WriteLine(instance["testkey"]);
于 2013-02-12T00:05:53.107 に答える
0

Nameを使用して平等を定義することがMyClass、この特定の辞書だけでなく、一般的に意味がある場合、これは問題への良いアプローチかもしれません。

public class MyClass
{
    public string Name { get; set; }
    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
    public override bool Equals(object other)
    {
        return this.Name == ((MyClass)other).Name;
    }
}

次に、辞書はオブジェクトによって単純に索引付けされMyClassます。stringインスタンスの代わりに明示的なものがあるMyClass場合は、次のようにディクショナリの値を取得できます。

dict[new MyClass { Name = "Foo" }]

次のものを追加することもできます。

public static implicit operator MyClass(string s)
{
    return new MyClass { Name = s };
}

そして、次のようなインデックス:

dict["Foo"]

繰り返しMyClassますが、これは、この特定の辞書で使用するだけでなく、一般的に意味がある場合にのみ実行してください。この特定の辞書の場合は、別の解決策を試してください。

于 2013-02-12T00:16:17.003 に答える