Search code examples
c#.netlinqlookup

What is the point of Lookup<TKey, TElement>?


The MSDN explains Lookup like this:

A Lookup<TKey, TElement> resembles a Dictionary<TKey, TValue>. The difference is that a Dictionary<TKey, TValue> maps keys to single values, whereas a Lookup<TKey, TElement> maps keys to collections of values.

I don't find that explanation particularly helpful. What is Lookup used for?


Solution

  • It's a cross between an IGrouping and a dictionary. It lets you group items together by a key, but then access them via that key in an efficient manner (rather than just iterating over them all, which is what GroupBy lets you do).

    For example, you could take a load of .NET types and build a lookup by namespace... then get to all the types in a particular namespace very easily:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml;
    
    public class Test
    {
        static void Main()
        {
            // Just types covering some different assemblies
            Type[] sampleTypes = new[] { typeof(List<>), typeof(string), 
                                         typeof(Enumerable), typeof(XmlReader) };
    
            // All the types in those assemblies
            IEnumerable<Type> allTypes = sampleTypes.Select(t => t.Assembly)
                                                   .SelectMany(a => a.GetTypes());
    
            // Grouped by namespace, but indexable
            ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);
    
            foreach (Type type in lookup["System"])
            {
                Console.WriteLine("{0}: {1}", 
                                  type.FullName, type.Assembly.GetName().Name);
            }
        }
    }
    

    (I'd normally use var for most of these declarations, in normal code.)