Advertisement
Guest User

Untitled

a guest
Oct 25th, 2013
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.84 KB | None | 0 0
  1. class CompoundEnumerator2<T1, T2, T3> : IEnumerator<Tuple<T1, T2, T3>>
  2. {
  3.     Tuple<IEnumerator<T1>, IEnumerator<T2>, IEnumerator<T3>> enumeratorsTuple;
  4.     IEnumerable<System.Collections.IEnumerator> enumerators;
  5.     bool fresh = true;
  6.  
  7.     public Tuple<T1, T2, T3> Current
  8.     {
  9.         get { return Tuple.Create(enumeratorsTuple.Item1.Current, enumeratorsTuple.Item2.Current, enumeratorsTuple.Item3.Current); }
  10.     }
  11.     object System.Collections.IEnumerator.Current { get { return Current; } }
  12.  
  13.     public CompoundEnumerator2(Tuple<IEnumerable<T1>, IEnumerable<T2>, IEnumerable<T3>> sets)
  14.     {
  15.         enumeratorsTuple = Tuple.Create(sets.Item1.GetEnumerator(), sets.Item2.GetEnumerator(), sets.Item3.GetEnumerator());
  16.         enumerators = new List<System.Collections.IEnumerator>() { enumeratorsTuple.Item1, enumeratorsTuple.Item2, enumeratorsTuple.Item3 };
  17.     }
  18.  
  19.     public bool MoveNext()
  20.     {
  21.         if (fresh)
  22.         {
  23.             var canMove = enumerators.All(e => e.MoveNext());
  24.             fresh = !canMove;
  25.             return canMove;
  26.         }
  27.  
  28.         foreach (var e in enumerators)
  29.         {
  30.             if (e.MoveNext())
  31.                 return true;
  32.             e.Reset();
  33.             e.MoveNext();
  34.         }
  35.         return false;
  36.     }
  37.  
  38.     public void Dispose()
  39.     {
  40.         foreach (var e in enumerators)
  41.             ((IDisposable)e).Dispose();
  42.     }
  43.  
  44.     public void Reset()
  45.     {
  46.         fresh = true;
  47.         foreach (var e in enumerators)
  48.             e.Reset();
  49.     }
  50. }
  51.  
  52. static IEnumerable<Tuple<T1, T2, T3>> CrossProduct2<T1, T2, T3>(IEnumerable<T1> set1, IEnumerable<T2> set2, IEnumerable<T3> set3)
  53. {
  54.     using (var enumerator = new CompoundEnumerator2<T1, T2, T3>(Tuple.Create(set1, set2, set3)))
  55.     {
  56.         while (enumerator.MoveNext())
  57.             yield return enumerator.Current;
  58.     }
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement