C#: How to Join Two List Using Lambdas Expression

Joining two Lists using Lambdas expression is very simple, lets say we have a inventory of computer products and we have a bunch of purchase orders to process.

So what I am going to do to demonstrate this is to create a class called Product that will have a string property for storing the product’s name and a decimal property for storing the unit price and a property for the product’s id.

	
public class Product
{
	public int Id {
		get;
		set;
	}
	public string Name {
		get;
		set;
	}
	public decimal UnitPrice {
		get;
		set;
	}
}

Then I create a class called Order that will have a property for the order number as a string, product id as an integer and quantity as a decimal.

public class Order
{
	public int ProductId {
		get;
		set;
	}
	public string Number {
		get;
		set;
	}
	public int Quantity {
		get;
		set;
	}
}

So now I have my classes created I will create a List of products and orders with values. For the Join to work, both lists must have a common reference, and that reference is the Product’s Id.

List<Product> products = new List<Product> {
	new Product { Id = 1, Name = "1TB SSD Drive", UnitPrice = 99 },
	new Product { Id = 2, Name = "Keyboard", UnitPrice = 39.95M },
	new Product { Id = 3, Name = "24 inch Monitor", UnitPrice = 124.99M }
};

As you can see below each order has a referece to a Product Id and a product can 0 to many orders.

List<Order> orders = new List<Order> {
	new Order { Number = "A100", ProductId = 2,  Quantity = 100 },
	new Order { Number = "QZ123", ProductId = 1, Quantity = 10 },
	new Order { Number = "1234", ProductId = 2, Quantity = 55 }
};

To join these two list you would use the Lambdas Join expression. Below I query the orders list and join it with the products list by the order’s ProductId and the product’s Id. Then I return each result with a custom object with all the values in it.

var results = orders.Join (products, o => o.ProductId, p => p.Id, ((o, p) => new { 
	ProductName = p.Name,
	UnitPrice = p.UnitPrice,
	Number = o.Number,
	Quantity = o.Quantity,
	TotalCost = p.UnitPrice * o.Quantity
})); 

To see the finishing result I write a foreach on the results and output the values to the console.

foreach (var order in results) {
	Console.WriteLine ("Order No: {0}, Product: {1}, Qty: {2}, Unit Price: {3}, Total Cost: {4}", order.Number, order.ProductName, order.Quantity, order.UnitPrice, order.TotalCost);
}
Shares