/// <summary> /// Initializes a new instance of the <see cref="PermutationProcessor"/> class. /// </summary> /// <param name="values">All objects, every element - one permutation item</param> /// <param name="fun">To break -> return true</param> public PermutationProcessor(IEnumerable values, Func <IEnumerable <object>, bool> fun) { IEnumerable <object> reverseList = values.Cast <object>().Reverse(); object[] generatedParams = new object[reverseList.Count()]; IPermutationNode firstNode = new PermutationProcessorFinalNode(fun, generatedParams); int resultIndex = reverseList.Count() - 1; foreach (object val in values.Cast <object>().Reverse()) { if (typeof(IEnumerable).IsAssignableFrom(val.GetType())) { firstNode = new PermutationProcessorNode((IEnumerable)val, resultIndex, firstNode, generatedParams); } else { firstNode = new PermutationProcessorOneElementNode(val, resultIndex, firstNode, generatedParams); } resultIndex--; } this.root = firstNode; }
/// <summary> /// Processors constructor /// </summary> /// <param name="values">All objects, every element - one permutation item</param> /// <param name="fun">To break -> return true</param> public PermutationProcessor(IEnumerable values, Func<IEnumerable<object>, bool> fun) { IEnumerable<object> reverseList = values.Cast<object>().Reverse(); object[] generatedParams = new object[reverseList.Count()]; IPermutationNode firstNode = new PermutationProcessorFinalNode(fun, generatedParams); int resultIndex = reverseList.Count() - 1; foreach (object val in values.Cast<object>().Reverse()) { if (val.GetType().IsArray || (val.GetType().IsGenericType && val.GetType().ReflectedType == typeof(Enumerable))) { firstNode = new PermutationProcessorNode((IEnumerable)val, resultIndex, firstNode, generatedParams); } else { firstNode = new PermutationProcessorOneElementNode(val, resultIndex, firstNode, generatedParams); } resultIndex--; } this.root = firstNode; }