- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在写一个 bijective dictionary class ,但出于两个原因,我想确保这两个泛型类型不是同一类型。
首先,我希望它实现 IDictionary
双向接口(interface),但是
public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>
给我“'BijectiveDictionary
其次,如果两种类型相同,我想编写一个优化的解决方案。
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)
map 3
至 2
还有,和[3]
会返回 2
.
然而,Jaroslav Jandek's solution建议使用第二个字典来处理 TKey
的情况。 != TValue
.虽然这对这些情况非常有效,(以及我最终决定实现的)它并不完全符合我的初衷 TKey
= TValue
, 通过允许 Add(2,3); Add(3,4)
映射单个键 3
两个值(一个方向上的 2
,另一个方向上的 4
),尽管我认为严格来说仍然是一个有效的双射函数。
最佳答案
这个怎么样(不同的方法):
public class BijectiveDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public BijectiveDictionary<TValue, TKey> Reversed { get; protected set; }
public BijectiveDictionary()
{
this.Reversed = new BijectiveDictionary<TValue,TKey>(true);
this.Reversed.Reversed = this;
}
protected BijectiveDictionary(bool reversedWillBeSetFromTheCallingBiji) { }
protected void AddRaw(TKey key, TValue value)
{
base.Add(key, value);
}
// Just for demonstration - you should implement the IDictionary interface instead.
public new void Add(TKey key, TValue value)
{
base.Add(key, value);
this.Reversed.AddRaw(value, key);
}
public static explicit operator BijectiveDictionary<TValue, TKey>(BijectiveDictionary<TKey, TValue> biji)
{
return biji.Reversed;
}
}
在代码中:
BijectiveDictionary<int, bool> a = new BijectiveDictionary<int, bool>();
a.Add(5, true);
a.Add(6, false);
Console.WriteLine(a[5]);// => True
Console.WriteLine(((BijectiveDictionary < bool, int>)a)[true]);// => 5
//or
Console.WriteLine(a.Reversed[true]);// => 5
关于c# - 使用 Where 指定不同的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172680/
我是一名优秀的程序员,十分优秀!