我有一个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"];
这可能吗?
答案 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
通常有意义的情况下才会这样做,而不仅仅是在这个特定字典中使用。如果是这个特定字典,请尝试其他解决方案。