枚举ILookup结果的成本?最好总是使用Dictionary <TKey,List <TElement >>?

Dav*_* S. 6 .net c#

ILookup<TKey,TElement> lookup经常从中获取元素并使用LINQ或者迭代它们foreach.我看起来像这样IEnumerable<TElement> results = lookup[key];.

因此,results每次使用查找结果时都需要至少枚举一次(如果我先不使用.ToList(),那么如果我多次迭代则更多).

即使它不是"干净",使用a也不是更好(性能方面)Dictionary<TKey,List<TElement>>,所以一个键的所有结果只在字典的构造中枚举?ToList()有多累赘?

Jon*_*eet 15

ToLookup和所有其他ToXXXLINQ方法一样,它使用立即执行.生成的对象没有引用原始源.它有效地建一个Dictionary<TKey, List<TElement>>-而不是那些确切的类型,也许,但等同于它.

请注意,虽然存在差异,但可能对您有用或可能没有用 - 如果您为其提供不存在的密钥而不是抛出异常,则查找的索引器将返回空序列.如果您希望能够通过任何键对其进行索引并迭代相应的值,那么这可以使生活变得更加容易.

另请注意,虽然没有明确记录,但是用于值序列的实现确实实现了ICollection<T>,因此调用LINQ Count()方法是O(1) - 它不需要迭代所有元素.

有关详细信息,请参阅我的Edulinq帖子ToLookup.

  • @David:是的,没错.迭代查找子序列很便宜.有时候ReSharper可能太聪明了;; (4认同)