public Permutation(IEnumerable <T> source, int length, CombinatoricModel model) { if (length < 0) { throw new ArgumentOutOfRangeException("length", "length must be greater than or equal to 0"); } _source = source; _length = length; _model = model; _comparer = EqualityComparer <T> .Default; }
//constructors //static methods static long count(IEnumerable <T> source, int length, CombinatoricModel model) { switch (model) { case CombinatoricModel.Normal: return(Combinatoric.FallingFactorial((long)source.Count(), length)); case CombinatoricModel.Repetition: return(((long)source.Count()).Power(length)); case CombinatoricModel.Distinct: var lookup = source.ToLookup(x => x); return(distinctCount(lookup.Select(x => x.LongCount()).OrderBy(x => x).ToList(), length, lookup.Count, source.Count() - length)); case CombinatoricModel.RepetitionDistinct: return(source.Distinct().LongCount().Power(length)); default: return(0L); } }
public static Combination <T> Combine <T>(this IEnumerable <T> source, int length, CombinatoricModel model) { return(new Combination <T>(source, length, model)); }