Create all possible combinations of items in a list using Linq and C#
algorithm, c#, linq, list
Solution
var result = list.GroupBy(t => t.Id).CartesianProduct();
using the CartesianProduct Extension Method from Eric Lippert's Blog:
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}));
}
Example:
var list = new[]
{
new { Id = 1, Description = "Red" },
new { Id = 1, Description = "Blue" },
new { Id = 1, Description = "Green" },
new { Id = 2, Description = "Small" },
new { Id = 2, Description = "Med" },
new { Id = 2, Description = "Large" },
new { Id = 3, Description = "Cotton" },
new { Id = 3, Description = "Silk" },
};
var result = list.GroupBy(t => t.Id).CartesianProduct();
foreach (var item in result)
{
Console.WriteLine(string.Join(" ", item.Select(x => x.Description)));
}
Output:
Red Small Cotton
Red Small Silk
Red Med Cotton
Red Med Silk
Red Large Cotton
Red Large Silk
Blue Small Cotton
Blue Small Silk
Blue Med Cotton
Blue Med Silk
Blue Large Cotton
Blue Large Silk
Green Small Cotton
Green Small Silk
Green Med Cotton
Green Med Silk
Green Large Cotton
Green Large Silk
Problem
I have a table of categories: ``` Catid | Desciption 1 | Color 2 | Size 3 | Material ``` And a table of category items ``` Catid | Name 1 | Red 1 | Blue 1 | Green 2 | Small 2 | Med 2 l Large 3 | Cotton 3 | Silk ``` I need to loop through all the items and display them in a labels like this: ``` Red Small Cotton Red Small Silk Red Med Cotton Red Med Silk Red Large Cotton Red Large Silk Blue Small Cotton Blue Small Silk Blue Med Cotton Blue Med Silk Blue Large Cotton Blue Large Silk Green Small Cotton Green Small Silk Green Med Cotton Green Med Silk Green Large Cotton Green Large Silk ``` Please note: There could be more or less categories. It is not predetermined. Any suggestions? Thank you