private static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
IEnumerable<IEnumerable<T>> dimensions)
{
return dimensions.Aggregate(
(IEnumerable<IEnumerable<T>>)new T[][] { new T[0] },
(acc, input) =>
from prevDimension in acc
from item in input
select prevDimension.Concat(new T[] { item }));
}
}