我想这并不重要,我只是好奇。
如果字典和查找之间的差异是一对一而另一对一,那么另一个的更具体/派生的版本不会是字典吗?
查找是键/值对的集合,其中键可以重复。 字典是键/值对的集合,其中键不能重复。
为什么IDictionary不能实现ILookup?
答案 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
。我不知道通过修改人们多年来一直使用的界面会得到什么。