字典TKey索引器使用字符串

时间:2013-02-12 00:00:15

标签: c# dictionary indexer

我有一个IDictionary<TKey, TValue>,其中TKey是一个类。我是否可以添加使用String值而不是TKey的索引器的功能?

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"];

这可能吗?

2 个答案:

答案 0 :(得分: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"]);

答案 1 :(得分: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通常有意义的情况下才会这样做,而不仅仅是在这个特定字典中使用。如果是这个特定字典,请尝试其他解决方案。