7

我有一个ILookup<TKey,TElement> lookup我经常从中获取元素并使用 LINQ 或foreach. 我这样看IEnumerable<TElement> results = lookup[key];

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

即使它不是“干净的”,使用 a 会不会更好(性能方面)Dictionary<TKey,List<TElement>>,以便键的所有结果仅在字典的构造时枚举?ToList() 到底有多麻烦?

4

2 回答 2

16

ToLookup与所有其他ToXXXLINQ 方法一样,使用立即执行。结果对象没有对原始源的引用。它确实有效地构建了一个Dictionary<TKey, List<TElement>>- 不是那些确切的类型,也许,但等价于它。

请注意,尽管存在差异,但它可能对您有用,也可能没有用 - 如果您给它一个不存在的键,则查找的索引器将返回一个空序列,而不是抛出异常。如果您希望能够通过任何键对其进行索引并迭代相应的值,那么这可以使生活变得更加轻松。

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

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

于 2012-09-12T13:29:11.403 回答
4

假设实现是System.Linq.Lookup(是否ILookup有任何其他实现?),呈现的元素lookup[key]存储在元素数组中作为System.Linq.Lookup.Grouping. 反复查找它们不会导致源代码的重新迭代。当然,重建Lookup成本会更高,但是一旦构建,源就不再被访问。

于 2012-09-12T13:24:29.223 回答