Lookup()和Dictionary(Of list())之间的区别

我试图围绕哪个数据结构是最有效的,何时何地使用哪个数据结构。

现在,我可能只是不太了解这个结构,但是一个ILookup(of key, ...)和一个Dictionary(of key, list(of ...))什么不同呢?

另外我想在哪里使用ILookup以及在程序速度/内存/数据访问等方面更高效?

两个显着差异:

  • Lookup是不可变的。 是的:)(至less,我相信具体的Lookup类是不可变的, ILookup接口不提供任何变异的成员,当然可能有其他可变的实现。
  • 当查找不在查询中的键时,会返回一个空序列,而不是KeyNotFoundException 。 (因此没有TryGetValue ,AFAICR。)

它们的效率可能相当,例如,查找可以在幕后使用Dictionary<TKey, GroupingImplementation<TValue>> 。 根据您的要求select它们。 就我个人而言,我发现查找通常比Dictionary<TKey, List<TValue>>更合适,主要是由于上面的前两点。

请注意,作为实现细节,用于值的IGrouping<,>的具体实现实现IList<TValue> ,这意味着与Count()ElementAt()等一起使用是有效的。

Dictionary<Key, List<Value>>Lookup<Key, Value>逻辑上都可以保存以类似方式组织的数据,并且两者的效率顺序相同。 主要的不同之处在于Lookup是不可变的:它没有Add()方法,也没有公共构造函数(正如Jon提到的,你可以查询一个不存在的exception的键,并且把键作为分组的一部分)。

至于你使用哪一个,这取决于你想如何使用它们。 如果你正在维护一个不断被修改的多个值的键映射,那么Dictionary<Key, List<Value>>可能是更好的,因为它是可变的。

但是,如果您拥有一系列数据,只需要按键组织数据的只读视图,则查找操作非常容易,并且会为您提供只读快照。

有趣的是,没有人指出了实际最大的差异(直接从MSDN采取):

查找类似于一个词典。 区别在于Dictionary将键映射到单个值,而Lookup将键映射到值集合。

ILookup<K,V>Dictionary<K, List<V>>之间的主要区别是字典是可变的; 您可以添加或删除键,还可以在查找的列表中添加或删除项目。 一个ILookup不可变的 ,一旦创build就不能被修改。

这两种机制的底层实现将是相同或相似的,所以他们的search速度和内存占用将大致相同。

还没有提到的另一个区别是,Lookup() 支持空键 :

查找类实现ILookup接口。 查找与字典非常相似,除了允许多个值映射到同一个键,并且支持空键。