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.
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.
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.
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 pages with code examples, which are updated to stay current. Programming is an art, and it can be learned from examples.
Donate to this site to help offset the costs of running the server. Sites like this will cease to exist if there is no financial support for them.
Sam Allen is passionate about computer languages, and he maintains 100% of the material available on this website. He hopes it makes the world a nicer place.