I have a class called GenericPermutations that is both enumerable and an enumerator. Its job is to take an ordered list of objects and iterate through each permutation of them in order.
Example, an integer implemenation of this class could iterate through the following:
GenericPermutations<int> p = new GenericPermutations<int>({ 1, 2, 3 });
p.nextPermutation(); // 123
p.nextPermutation(); // 132
p.nextPermutation(); // 213
// etc.
So its enumerable in the sense that it contains a ‘list’ of things you can enumerate over. It’s also an enumerator, because its job involves finding the next permutation.
THE ISSUE: I am currently trying to integrate IEnumerator and IEnumerable with this class, and it seems to me like it should be both (rather than using a sub class as the IEnumerable). Thus far I have avoided the issue with trying to get two enumerators from it by passing a new GenericPermutation object in the GetEnumerator method.
Is this a bad idea? Anything else I should consider?
Reduce your confusion (?) by using the generic versions of
IEnumerableandIEnumerator.A permutation enumerable is
IEnumerable<IEnumerable<T>>. So you might have something likeand
Furthermore, I’ve seen more than one case where a single type implemented both
IEnumerable<T>andIEnumerator<T>; its GetEnumerator method was simplyreturn this;.I think such a type would need to be a struct, though, because if it were a class you’d have all sorts of problems if you called GetEnumerator() a second time before the first enumeration was completed.
EDIT: Consuming the permuter
Assuming the input sequence is { 1, 2, 3 }, the output is
EDIT:
Here’s a super-inefficient implementation to illustrate the suggestion: