using System; using System.Collections.Generic; using System.Linq; namespace AioNet.Linq { public static class ExtendedLinq { public static IEnumerable> Combinations( this IEnumerable source, int subsequenceLength ) { return source.Combinations(subsequenceLength, Enumerable.Empty()); } private static IEnumerable> Combinations( this IEnumerable source, int subsequenceLength, IEnumerable build ) { if (build.Count() == subsequenceLength) { return new IEnumerable[] { build }; } if (!source.Any()) { return Enumerable.Empty>(); } IEnumerable rest = source.Skip(1); IEnumerable> combinationsSkipping = rest.Combinations( subsequenceLength, build ); IEnumerable> combinationsTaking = rest.Combinations( subsequenceLength, build.Append(source.First()) ); return combinationsTaking.Concat(combinationsSkipping); } } }