public IEnumerator <IEnumerable <T> > GetEnumerator() { if (_startLevel + 1 == _setOfValues.Length) { yield return(Enumerable.Repeat(_setOfValues.ElementAt(_startLevel), 1)); } else { PermutationGenerator <T> permutations = new PermutationGenerator <T>(_setOfValues, _startLevel + 1); foreach (var permutation in permutations.ToList()) { foreach (var newPermutation in Mix(_setOfValues[_startLevel], permutation).ToList()) { yield return(newPermutation); } } } }