为什么不能/不能IDictionary <tkey,tvalue>实现ILookup <tkey,tvalue>?</tkey,tvalue> </tkey,tvalue>

时间:2011-02-24 01:46:45

标签: c# dictionary

我想这并不重要,我只是好奇。

如果字典和查找之间的差异是一对一而另一对一,那么另一个的更具体/派生的版本不会是字典吗?

查找是键/值对的集合,其中键可以重复。 字典是键/值对的集合,其中键不能重复。

为什么IDictionary不能实现ILookup?

3 个答案:

答案 0 :(得分:4)

我怀疑这主要是因为意图不同。

ILookup<T,U>专门用于处理一组值。 IDictionary<T,U>旨在使用单个值(当然可以是一个集合)。

当然,虽然你可以IDictionary<T,U>个实现通过返回带有单个值的IEnumerable<U>来实现这一点,但这会让人感到困惑,特别是如果你的“U”是一个集合本身(即: List<int>)。在这种情况下,ILookup<T,U>.Item会返回IEnumerable<List<int>>,还是会对IEnumerable<T>值类型进行某种类型的检查,然后“展平”它?无论哪种方式,它看起来都很混乱,并且增加了可疑的价值。

答案 1 :(得分:2)

接口IDictionary<T,U>ILookup<T,U>都继承IEnumerable。如果将IDictionary<T,U>强制转换为IEnumerable并且在其上调用GetEnumerator(),则生成的枚举数应返回KeyValuePair<T,U>的实例。如果将ILookup<T,U>强制转换为IEnumerable并且调用GetEnumerator(),则生成的枚举数应返回IGrouping<T,U>的实例。如果KeyValuePair<T,U>结构被修改为实现可能可行的IGrouping<T,U>,但几乎不干净。

答案 2 :(得分:1)

我怀疑是因为IDictionary'2界面早在ILookup'2之前出现了。回去修改是不必要的。具体实现可以使用ILookup'2。我不知道通过修改人们多年来一直使用的界面会得到什么。