gpt4 book ai didi

c# - 使用 Where 指定不同的泛型

转载 作者:太空狗 更新时间:2023-10-29 17:54:17 27 4
gpt4 key购买 nike

我正在写一个 bijective dictionary class ,但出于两个原因,我想确保这两个泛型类型不是同一类型。

首先,我希望它实现 IDictionary双向接口(interface),但是

public class BijectiveDictionary<TKey, TValue>
: IDictionary<TKey, TValue>, IDictionary<TValue, TKey>

给我“'BijectiveDictionary ' 不能同时实现'IDictionary ' 和'IDictionary ' 因为它们可能统一一些类型参数替换”(这是可以理解的,但是不受欢迎。)

其次,如果两种类型相同,我想编写一个优化的解决方案。

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 32还有,和[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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com