C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Part 1: We create 2 arrays. The goal of our joins will be to get elements from the first array based on the values in the second array.
Part 2: We call the Join method with lambdas. The lambdas join if the first value from ints1 is present in ints2 with 1 added.
LambdaPart 3: We use a query expression version. This performs the same joins as the extension method call.
Result: If ints1 contains an element of value 4, it is selected only if there is an element of value of 5 in ints2.
Int ArrayC# program that uses Join
using System;
using System.Linq;
class Program
{
static void Main()
{
// Part 1: create array 1 and array 2.
var ints1 = new int[3];
ints1[0] = 4;
ints1[1] = 3;
ints1[2] = 0;
var ints2 = new int[3];
ints2[0] = 5;
ints2[1] = 4;
ints2[2] = 2;
{
// Part 2: join with method call.
var result = ints1.Join<int, int, int, int>(ints2,
x => x + 1,
y => y,
(x, y) => x);
// Display results.
foreach (var r in result)
{
Console.WriteLine(r);
}
}
{
// Part 3: join with query expression.
var result = from t in ints1
join x in ints2 on (t + 1) equals x
select t;
// Display results.
foreach (var r in result)
{
Console.WriteLine(r);
}
}
}
}
Output
4 (First loop)
3
4 (Second loop)
3
Info: In the query expression, the customers array is used and each element from that array is identified as "c".
And: The orders array is also used, and each element from that is identified as "o".
ID: The join takes the ID property from "c" and "o" and matches them. As the matches occur, new elements are created in the result.
SQL: This syntax is basically the same as in SQL. Occasionally it is easier to develop logic in this style of language.
C# program that uses join and equals in query
using System;
using System.Linq;
class Customer
{
public int ID { get; set; }
public string Name { get; set; }
}
class Order
{
public int ID { get; set; }
public string Product { get; set; }
}
class Program
{
static void Main()
{
// Example customers.
var customers = new Customer[]
{
new Customer{ID = 5, Name = "Sam"},
new Customer{ID = 6, Name = "Dave"},
new Customer{ID = 7, Name = "Julia"},
new Customer{ID = 8, Name = "Sue"}
};
// Example orders.
var orders = new Order[]
{
new Order{ID = 5, Product = "Book"},
new Order{ID = 6, Product = "Game"},
new Order{ID = 7, Product = "Computer"},
new Order{ID = 8, Product = "Shirt"}
};
// Join on the ID properties.
var query = from c in customers
join o in orders on c.ID equals o.ID
select new { c.Name, o.Product };
// Display joined groups.
foreach (var group in query)
{
Console.WriteLine("{0} bought {1}", group.Name, group.Product);
}
}
}
Output
Sam bought Book
Dave bought Game
Julia bought Computer
Sue bought Shirt
So: A cat with a specific ID may have 2 medications prescribed to it. The Join call resolves all of these.
And: We use the Join() method with lambda expression arguments. This is equivalent a query expression with the "join" clause.
C# program that uses Join, lambda expressions
using System;
using System.Linq;
class Animal
{
public int ID { get; set; }
public string Breed { get; set; }
}
class Medication
{
public int ID { get; set; }
public string Type { get; set; }
}
class Program
{
static void Main()
{
// Example animals in veterinarian office.
var animals = new Animal[]
{
new Animal{ID = 0, Breed = "cat"},
new Animal{ID = 10, Breed = "dog"}
};
// Example medications (prescriptions).
var medications = new Medication[]
{
new Medication{ID = 10, Type = "antibiotic"},
new Medication{ID = 0, Type = "sedative"},
new Medication{ID = 0, Type = "antihistimine"}
};
// Use fluent join syntax on ID.
var query = animals.Join(medications,
a => a.ID,
m => m.ID,
(a, m) => new { a.Breed, m.Type });
// Results.
foreach (var group in query)
{
Console.WriteLine($"{group.Breed} prescribed {group.Type}");
}
}
}
Output
cat prescribed sedative
cat prescribed antihistimine
dog prescribed antibiotic
And: We can only select a single value. But GroupJoin is invoked with the join query expression keyword.
GroupJoinInfo: This material is complex, tiresome and not all that useful for actual development.
And: This is near the end of the horrifying 143-page chapter on expressions. Thoroughness is helpful in language specifications.
Note: Thanks to Rob Martin for suggesting the Join() fluent syntax example. Two lambda expressions must be used.