我想这并不重要,只是出于好奇。
如果字典和查找的区别在于一个是一对一关系,另一个是一对多关系,那么字典不是更具体/派生版本的查找吗?
查找是一组键/值对的集合,其中键可以重复使用。 字典是一组键/值对的集合,其中键不能重复使用。
为什么IDictionary不能实现ILookup?
我想这并不重要,只是出于好奇。
如果字典和查找的区别在于一个是一对一关系,另一个是一对多关系,那么字典不是更具体/派生版本的查找吗?
查找是一组键/值对的集合,其中键可以重复使用。 字典是一组键/值对的集合,其中键不能重复使用。
为什么IDictionary不能实现ILookup?
ILookup<T,U>
的设计专为处理值的集合。而 IDictionary<T,U>
则旨在处理单个值(当然,该值也可以是一个集合)。IEnumerable<U>
实现对 IDictionary<T,U>
进行操作,但这会让人困惑,特别是如果你的“U”本身就是一个集合(例如: List<int>
)。在这种情况下,ILookup<T,U>.Item
应该返回一个 IEnumerable<List<int>>
吗?还是应该检查一个 IEnumerable<T>
值类型,然后“展平”它?无论哪种方式,都会变得混乱,并增加可疑的价值。接口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>
,那么这可能是可行的,但不够干净。
我猜这是因为 IDictionary'2
接口比 ILookup'2
早出现很久了。回头修改是不必要的。具体实现可以使用 ILookup'2
。我不认为修改一个人们已经使用多年的接口会有什么好处。