Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All

Enumerable.ToLookup<TSource, TKey, TElement> Method (IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>)

Creates a Lookup<TKey, TElement> from an IEnumerable<T> according to specified key selector and element selector functions.

Namespace:  System.Linq
Assemblies:   System.Linq (in System.Linq.dll)
  System.Core (in System.Core.dll)

public static ILookup<TKey, TElement> ToLookup<TSource, TKey, TElement>(
	this IEnumerable<TSource> source,
	Func<TSource, TKey> keySelector,
	Func<TSource, TElement> elementSelector

Type Parameters


The type of the elements of source.


The type of the key returned by keySelector.


The type of the value returned by elementSelector.


Type: System.Collections.Generic.IEnumerable<TSource>

The IEnumerable<T> to create a Lookup<TKey, TElement> from.

Type: System.Func<TSource, TKey>

A function to extract a key from each element.

Type: System.Func<TSource, TElement>

A transform function to produce a result element value from each element.

Return Value

Type: System.Linq.ILookup<TKey, TElement>
A Lookup<TKey, TElement> that contains values of type TElement selected from the input sequence.

Usage Note

In Visual Basic and C#, you can call this method as an instance method on any object of type IEnumerable<TSource>. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).


source or keySelector or elementSelector is null.

The ToLookup<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>) method returns a Lookup<TKey, TElement>, a one-to-many dictionary that maps keys to collections of values. A Lookup<TKey, TElement> differs from a Dictionary<TKey, TValue>, which performs a one-to-one mapping of keys to single values.

The default equality comparer Default is used to compare keys.

The following code example demonstrates how to use ToLookup<TSource, TKey, TElement>(IEnumerable<TSource>, Func<TSource, TKey>, Func<TSource, TElement>) to create a Lookup<TKey, TElement> by using a key selector function and an element selector function.

            class Package
                public string Company { get; set; }
                public double Weight { get; set; }
                public long TrackingNumber { get; set; }

            public static void ToLookupEx1()
                // Create a list of Packages.
                List<Package> packages =
                    new List<Package>
                        { new Package { Company = "Coho Vineyard", 
                              Weight = 25.2, TrackingNumber = 89453312L },
                          new Package { Company = "Lucerne Publishing", 
                              Weight = 18.7, TrackingNumber = 89112755L },
                          new Package { Company = "Wingtip Toys", 
                              Weight = 6.0, TrackingNumber = 299456122L },
                          new Package { Company = "Contoso Pharmaceuticals", 
                              Weight = 9.3, TrackingNumber = 670053128L },
                          new Package { Company = "Wide World Importers", 
                              Weight = 33.8, TrackingNumber = 4665518773L } };

                // Create a Lookup to organize the packages.  
                // Use the first character of Company as the key value. 
                // Select Company appended to TrackingNumber  
                // as the element values of the Lookup.
                ILookup<char, string> lookup =
                    .ToLookup(p => Convert.ToChar(p.Company.Substring(0, 1)),
                              p => p.Company + " " + p.TrackingNumber);

                // Iterate through each IGrouping in the Lookup. 
                foreach (IGrouping<char, string> packageGroup in lookup)
                    // Print the key value of the IGrouping.
                    // Iterate through each value in the  
                    // IGrouping and print its value. 
                    foreach (string str in packageGroup)
                        Console.WriteLine("    {0}", str);

             This code produces the following output:

                 Coho Vineyard 89453312
                 Contoso Pharmaceuticals 670053128
                 Lucerne Publishing 89112755
                 Wingtip Toys 299456122
                 Wide World Importers 4665518773

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

XNA Framework

Supported in: 3.0

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone Silverlight 8.1, Windows Phone Silverlight 8

Portable Class Library

Supported in: Portable Class Library
© 2015 Microsoft