字典是一种1:1映射(每个键被映射到单个值),且字典在创建后可以进行修改。
查找表是一种1:多映射(多映射;每个键与具有该键的值的IEnumerable<>
相关联),并且ILookup<,>
接口上没有改变操作。
顺便说一下,你可以查询一个不存在的关键字的查找表(通过索引器),然后会得到一个空序列。如果使用字典进行相同操作,则会抛出异常。
那么:有多少记录共享每个键?
简单来看,Lookup<TKey,TValue>
与Dictionary<TKey,IEnumerable<TValue>>
是大致可比的
ToDictionary 是 <TKey, TValue> 类型的,而 ToLookup<TKey, T1, T2, T3, ...> 类型类似于 IGrouping,但枚举保留在内存中。
ToLookup
和ToDictionary
(这些方法本身)几乎具有相同的API。 - Marc Gravell
ILookup<,>
中,如果查找一个不存在的键时返回空序列的行为是标准合同的一部分,还是实现可以选择抛出KeyNotFoundException
是不确定的。Rx 中的实现抛出了KeyNotFoundException
异常。 - LukazoidDictionary<TKey, IEnumerable<TValue>>
可以被描述为一个列表字典。因此,ToLookup()
就像是在说:给我一个列表字典。不知道为什么,用这种方式描述它有助于我更好地理解它。 - Nate Cook