Home
C#
GroupJoin Method
This page was last reviewed on May 6, 2023.
Dot Net Perls
GroupJoin. This is a C# extension method. It groups one collection of objects by a key and joins those groups with another collection of keyed objects.
Extension
With this method, we create a collection where, at each key, a group of results is placed. GroupJoin is used with 3 lambda expressions.
GroupBy
group
Example. The GroupJoin method is challenging to use. It requires at least 4 arguments. We can specify these Func types with the lambda expression syntax.
Func
Info Argument one is the secondary collection. And argument two is a Func that returns the key from the first object type.
Note A Func that returns the key from the second object type, and one that stores the grouped object with the group itself.
Note 2 We use regular classes. It is probably more common to use anonymous types with GroupJoin.
Lambda
Finally We loop over the resulting collection with the foreach-loop construct. We print the results.
foreach
using System; using System.Collections.Generic; using System.Linq; class Customer { public int Code { get; set; } public string Name { get; set; } } class Order { public int KeyCode { get; set; } public string Product { get; set; } } class Result { public string Name { get; set; } public IEnumerable<Order> Collection { get; set; } public Result(string name, IEnumerable<Order> collection) { this.Name = name; this.Collection = collection; } } class Program { static void Main() { // Example customers. var customers = new Customer[] { new Customer{Code = 5, Name = "Sam"}, new Customer{Code = 6, Name = "Dave"}, new Customer{Code = 7, Name = "Julia"}, new Customer{Code = 8, Name = "Sue"} }; // Example orders. var orders = new Order[] { new Order{KeyCode = 5, Product = "Book"}, new Order{KeyCode = 6, Product = "Game"}, new Order{KeyCode = 7, Product = "Computer"}, new Order{KeyCode = 7, Product = "Mouse"}, new Order{KeyCode = 8, Product = "Shirt"}, new Order{KeyCode = 5, Product = "Underwear"} }; // Correlate "customers" with "orders" // ... Use Code property as key for Customer. // ... Use KeyCode property as key for Order. // ... For each result, create object with Name and IEnumerable of orders. var query = customers.GroupJoin(orders, c => c.Code, o => o.KeyCode, (c, result) => new Result(c.Name, result)); // Enumerate results. foreach (var result in query) { Console.WriteLine("{0} bought...", result.Name); foreach (var item in result.Collection) { Console.WriteLine(item.Product); } } } }
Sam bought... Book Underwear Dave bought... Game Julia bought... Computer Mouse Sue bought... Shirt
A similar implementation could be built using an object model. You could use a Dictionary, put objects as the keys, while implementing IEqualityComparer.
Dictionary
IEqualityComparer
Next You could use the List type to store the individual objects on each value in the Dictionary.
However This solution would have the performance advantages of Dictionary, while avoiding any performance drawbacks of GroupJoin.
List
A summary. With GroupJoin, from the System.Linq namespace, we can group objects from one collection with any number of objects with from another collection.
The method is challenging to use, as it receives 3 Funcs. GroupJoin can be helpful when you need to create a grouped collection and do not want to write imperative code.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on May 6, 2023 (edit).
Home
Changes
© 2007-2024 Sam Allen.