public static IEnumerable<IEnumerable<T>> Cartesian<T>(IEnumerable<IEnumerable<T>> sequences) { return sequences.Aggregate(Enumerable.Repeat(Enumerable.Empty<T>(), 1), (accumulator, sequence) => accumulator.SelectMany(acc => sequence.Select(item => acc.Append(item)))); } public static IEnumerable<IEnumerable<T>> CartesianRecursive<T>(IEnumerable<IEnumerable<T>> sequences) { if (!sequences.Any()) { yield return Enumerable.Empty<T>(); yield break; } var firstSet = sequences.First(); var remainderSets = CartesianRecursive(sequences.Skip(1)); foreach (var item in firstSet) { foreach (var remainder in remainderSets) { yield return new[] { item }.Concat(remainder); } } }
938000cookie-checkC# Cartesian product