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"];
这可能吗?
您可以基于类创建自己的字典类。
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
有意义的情况下才这样做,而不仅仅是在这个特定的字典中使用。如果是针对这本特定的词典,请尝试其他解决方案。