【发布时间】:2016-08-29 13:21:58
【问题描述】:
在我的应用程序的某个时刻,我遇到了一个类实例需要三个字符串键的问题(我使用的是 C# 3.5,所以我不能使用元组)。通过在线查找,我发现了这个答案,我使用了它的代码:https://stackoverflow.com/a/15804355/5090537
在根据我的需要定制它的点点滴滴之后,最后我的自定义类看起来像这样:
public class MultiKeyDictionary<K1, K2, K3, V> : Dictionary<K1, MultiKeyDictionary<K2, K3, V>>
{
public V this[K1 key1, K2 key2, K3 key3]
{
get
{
return ContainsKey(key1) ? this[key1][key2, key3] : default(V);
}
set
{
if (!ContainsKey(key1))
this[key1] = new MultiKeyDictionary<K2, K3, V>();
this[key1][key2, key3] = value;
}
}
public bool ContainsKey(K1 key1, K2 key2, K3 key3)
{
return base.ContainsKey(key1) && this[key1].ContainsKey(key2, key3);
}
public void Add(K1 key1, K2 key2, K3 key3, V value)
{
if (!ContainsKey(key1))
this[key1] = new MultiKeyDictionary<K2, K3, V>();
if (!this[key1].ContainsKey(key2, key3))
this[key1][key2] = new Dictionary<K3, V>();
this[key1][key2][key3] = value;
}
}
这非常适合我的需求,但我对此数据结构有一些疑问:
1) 由于我实际上是从Dictionary(K1, Dictionary(K2, V)) 继承的,因此假设为我实现了GetHashCode 并且我不需要指定单独的实现是否正确? Equals 也一样?
2) 我需要创建自己的自定义类的前提也是正确的吗?例如,因为我不能使用字符串数组或字符串列表,因为那样会有ReferenceEquals 比较而不是我需要的成员比较(key1 等于 key1,key2 等于 key2,key3 等于 key3) ?
【问题讨论】:
-
使用
Dictionary<Tuple<string,string,string>,YourClass>直接解决方案,或者您也可以使用List<Tuple<string,string,string,YourClass>> -
@HadiHassan :问题中专门解决了这个问题 - 在 C# 4 之前,
Tuple类不可用。 -
@GaryMcGill 我认为 3 个键的元组可以很容易地完成,但我不认为构建一个数据结构(字典字典的字典)来表示具有 3 个键的数据是一个不错的选择在这里,(要使用或从头开始实现采用 3 个键和一个对象值的元组类更容易和直接)。没仔细看问题,直接看代码和下面。
-
我第二个@HadiHassan。从三个字符串创建一个(相当简单的)结构(当然,正确定义相等和散列),基本上模拟
Tuple;并使用该结构作为 一维Dictionary. 中的键
标签: c# .net dictionary hashcode