Cristi Diaconescu - 2 years ago 78
C# Question

# Linq to return ALL pairs of elements from two lists?

Given lists

`l1 = {1, 2}`
and
`l2 = {4, 5, 6 }`
I want to get a new list that has elements:

``````rez = { {1, 4}, {1, 5}, {1, 6}, {2, 4}, {2, 5}, {2, 6} }
``````

Suggestions?

Yes it is possible. Eric Lippert wrote a very good article on this topic:

Computing a Cartesian Product with LINQ

If you only have 2 lists, then you could directly use multiple `from` like this:

``````from a in s1
from b in s2
select new [] { a, b};
``````

or even:

``````s1.SelectMany(a => s2.Select(b => new [] { a, b }));
``````

But the solution given by Eric Lippert in the previous article allows you to compute the cartesian product of several sequences. With the following extension method:

``````public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item }));
}
``````

You could write:

``````var l1 = new[] {1, 2};
var l2 = new[] {4, 5, 6};
var l3 = new[] {7, 3};

foreach (var result in new []{l1,l2,l3}.CartesianProduct())
{
Console.WriteLine("{"+string.Join(",",result)+"}");
}
``````

And obtain:

``````{1,4,7}
{1,4,3}
{1,5,7}
{1,5,3}
{1,6,7}
{1,6,3}
{2,4,7}
{2,4,3}
{2,5,7}
{2,5,3}
{2,6,7}
{2,6,3}
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download