Dictionary TKey索引器使用字符串

本文关键字:字符串 TKey 索引 Dictionary | 更新日期: 2023-09-27 17:58:40

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

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

这可能吗?

Dictionary TKey索引器使用字符串

您可以基于类创建自己的字典类。

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

如果使用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有意义的情况下才这样做,而不仅仅是在这个特定的字典中使用。如果是针对这本特定的词典,请尝试其他解决方案。