LINQ ToDictionary和ToLookup有什么区别?

160

LINQ ToDictionary和ToLookup的区别是什么?它们似乎做了相同的事情。

2个回答

233

字典是一种1:1映射(每个键被映射到单个值),且字典在创建后可以进行修改。

查找表是一种1:多映射(多映射;每个键与具有该键的值的IEnumerable<>相关联),并且ILookup<,>接口上没有改变操作。

顺便说一下,你可以查询一个不存在的关键字的查找表(通过索引器),然后会得到一个空序列。如果使用字典进行相同操作,则会抛出异常。

那么:有多少记录共享每个键?

简单来看,Lookup<TKey,TValue>Dictionary<TKey,IEnumerable<TValue>>大致可比的


7
与groupby有些相似吗? - Carlo V. Dango
7
ILookup<,> 中,如果查找一个不存在的键时返回空序列的行为是标准合同的一部分,还是实现可以选择抛出 KeyNotFoundException 是不确定的。Rx 中的实现抛出了 KeyNotFoundException 异常。 - Lukazoid
如果有帮助的话:Dictionary<TKey, IEnumerable<TValue>> 可以被描述为一个列表字典。因此,ToLookup() 就像是在说:给我一个列表字典。不知道为什么,用这种方式描述它有助于我更好地理解它。 - Nate Cook

-6

ToDictionary 是 <TKey, TValue> 类型的,而 ToLookup<TKey, T1, T2, T3, ...> 类型类似于 IGrouping,但枚举保留在内存中。


6
不太确定你试图用“T1,T2,T3,...”来说明什么;ToLookupToDictionary(这些方法本身)几乎具有相同的API。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接