Zipper (2)

昨日かけなかったの。

    // code formatted by http://manoli.net/csharpformat/
    public class Zipper2<T, U>
    {
        private readonly T t;
        private readonly U u;

        private Zipper2(T t, U u)
        {
            this.t = t;
            this.u = u;
        }

        public T First
        {
            get { return t; }
        }

        public U Second
        {
            get { return u; }
        }

        public static IEnumerable<Zipper2<T, U>> GetEnumerator(IEnumerator<T> t, IEnumerator<U> u)
        {
            // 双方のポイントする位置を一致させるため && ではなく & を使う。
            while (t.MoveNext() & u.MoveNext())
            {
                yield return new Zipper2<T, U>(t.Current, u.Current);
            }
        }

        public static IEnumerable<Zipper2<T, U>> GetEnumerator(IEnumerable<T> t, IEnumerable<U> u)
        {
            foreach (Zipper2<T, U> z in GetEnumerator(t.GetEnumerator(), u.GetEnumerator()))
            {
                yield return z;
            }
        }

超つまんない。Zipper3, Zipper4,, と作るとアホらしくなる。LCG じゃ GetEnumerator(params IEnumerator[] e) は作れても、値を保持する側の型が作れないしなー。