Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class CompoundEnumerator2<T1, T2, T3> : IEnumerator<Tuple<T1, T2, T3>>
- {
- Tuple<IEnumerator<T1>, IEnumerator<T2>, IEnumerator<T3>> enumeratorsTuple;
- IEnumerable<System.Collections.IEnumerator> enumerators;
- bool fresh = true;
- public Tuple<T1, T2, T3> Current
- {
- get { return Tuple.Create(enumeratorsTuple.Item1.Current, enumeratorsTuple.Item2.Current, enumeratorsTuple.Item3.Current); }
- }
- object System.Collections.IEnumerator.Current { get { return Current; } }
- public CompoundEnumerator2(Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>> sets)
- {
- enumeratorsTuple = Tuple.Create(sets.Item1.GetEnumerator(), sets.Item2.GetEnumerator(), sets.Item3.GetEnumerator());
- enumerators = new List<System.Collections.IEnumerator>() { enumeratorsTuple.Item1, enumeratorsTuple.Item2, enumeratorsTuple.Item3 };
- }
- public bool MoveNext()
- {
- if (fresh)
- {
- var canMove = enumerators.All(e => e.MoveNext());
- fresh = !canMove;
- return canMove;
- }
- foreach (var e in enumerators)
- {
- if (e.MoveNext())
- return true;
- e.Reset();
- e.MoveNext();
- }
- return false;
- }
- public void Dispose()
- {
- foreach (var e in enumerators)
- ((IDisposable)e).Dispose();
- }
- public void Reset()
- {
- fresh = true;
- foreach (var e in enumerators)
- e.Reset();
- }
- }
- static IEnumerable<Tuple<T1, T2, T3>> CrossProduct2<T1, T2, T3>(IEnumerable<T1> set1, IEnumerable<T2> set2, IEnumerable<T3> set3)
- {
- using (var enumerator = new CompoundEnumerator2<T1, T2, T3>(Tuple.Create(set1, set2, set3)))
- {
- while (enumerator.MoveNext())
- yield return enumerator.Current;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement