我正在编写bijective dictionary class,但我想确保两种泛型类型不是相同的类型有两个原因。使用何处指定不同的泛型
首先,我想它来实现在两个方向上IDictionary
接口,但
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
给我“ 'BijectiveDictionary < TKEY的,TValue >' 不能同时实现 '的IDictionary < TKEY的,TValue >' 和“IDictionary的< TValue,TKEY的>”,因为他们可以结合一些类型参数替换“(这是可以理解的,但不可取。)
其次,我想编写一个选择如果两种类型都相同,则可以使用模型化解
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue> where TValue : TKey
{
// Optimized solution
}
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey> where TValue : !TKey
{
// Standard solution
}
这可能吗?
如果不是,我可以考虑不执行IDictionary
,但我不能保证TValue this[TKey key]
和TKey this[TValue key]
会不一样,这将是不幸的。
它看起来像这里的问题是,当这两种类型是相同的,特殊情况出现。
我最初的目的是创建一个字典,它恰好映射一个键到一个值,反之亦然,因此每KeyValuePair<TKey, TValue>(X, Y)
也存在一个KeyValuePair<TValue, TKey>(Y, X)
。
当TKey
= TValue
,那么这可以被简化为单一的词典:
public T this[T key]
{
get { return this[key]; }
set
{
base.Add(key, value);
base.Add(value, key);
}
}
在这种情况下,你不能Add(2,3); Add(3,4)
因为Add(2,3)
映射3
到2
的欢迎,并[3]
将返回2
。
然而,Jaroslav Jandek's solution建议使用第二个字典来做这个,当TKey
!= TValue
。虽然这对于那些情况(以及我最终决定实施的内容)而言非常有效,但当TKey
= TValue
时,通过允许Add(2,3); Add(3,4)
将单个密钥3
映射为两个值(2
in一个方向,另一个方向4
),尽管我严格相信仍然是一个有效的双射函数。
您使用的是字典呢?你甚至需要你的字典中的Surjection部分吗?也就是说,我的答案中的代码处理所有的情况(实现IDictonary,提供双注并处理TKey == TValue的情况)。 – 2010-07-04 10:49:45
如果你想双向注入'TKey == TValue',你可以使用'SelfBijectiveDictionary:BijectiveDictionary {...}'并重写它的'Add'方法并首先检查if(base.Contains(key) | this.Reversed.Contains(value))throw ...'。 无论如何,类应该有不同的命名,因为一个是双射'X-> Y'和另一个'S-> S'(双射本身)。 –
2010-07-06 17:54:59
指出'X-> Y'和'S-> S'之间的区别有很大帮助。对不起所有的困惑!是的 - 我为他们制作了两个单独命名的字典。谢谢你的帮助。 – dlras2 2010-07-06 19:11:51