/// <summary> Creates one CombinationWithGaps out of the specified ones. </summary> public static CombinationWithGaps <T> Combine(IEnumerable <CombinationWithGaps <T> > combinations) { Contract.Requires(combinations != null); Contract.LazilyRequires(ref combinations, NotNull); Contract.Requires(combinations.SelectMany(combi => combi.AllIntervalsIn()).ToSortedList(IntervalExtensions.Compare).AreDisjoint()); return(new CombinationWithGaps <T>(combinations.SelectMany(combi => combi.Combination).ToReadOnlyList(), combinations.SelectMany(combi => combi.Gaps).ToList())); }
private static IEnumerable <T[]> AllCombinations <T>(IEnumerable <int> counts, Func <int, int, T> select) { Contract.Requires(counts != null); Contract.LazilyRequires(ref counts, count => count >= 0); Contract.Requires(select != null); var result = EnumerableExtensions.Range(counts.ToList()) .Select(elementIndices => elementIndices.Map(select)); EnsureSingleEnumerationDEBUG(ref result); return(result); }