using System; using System.Linq; using System.Collections; using System.Collections.Generic; public class Test { public static void Main() { var A = new VisibleIterator("A"); var B = new VisibleIterator("B"); var C = new VisibleIterator("C"); var D = new VisibleIterator("D"); Console.WriteLine("--- A.Union(B).Union(C).Union(D)"); var foo = (A.Union(B).Union(C).Union(D)).ToList(); Console.WriteLine("--- A.Union(B.Union(C.Union(D)))"); var bar = (A.Union(B.Union(C.Union(D)))).ToList(); Console.WriteLine("--- D.Union(C.Union(B.Union(A)))"); var baz = (D.Union(C.Union(B.Union(A)))).ToList(); } } class VisibleIterator : IEnumerable<VisibleHasher> { private readonly string name; public VisibleIterator(string name) { this.name = name; } public IEnumerator<VisibleHasher> GetEnumerator() { for (var i = 0 ; i != 4 ; i++) { var res = name+i; Console.WriteLine("Iterating " + res); yield return new VisibleHasher(res); } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } class VisibleHasher { private readonly string val; public VisibleHasher(String val) { this.val = val; } public override int GetHashCode() { Console.WriteLine("Hashing '" + val + "'"); return val.GetHashCode(); } }
Standard input is empty
--- A.Union(B).Union(C).Union(D) Iterating A0 Hashing 'A0' Hashing 'A0' Hashing 'A0' Iterating A1 Hashing 'A1' Hashing 'A1' Hashing 'A1' Iterating A2 Hashing 'A2' Hashing 'A2' Hashing 'A2' Iterating A3 Hashing 'A3' Hashing 'A3' Hashing 'A3' Iterating B0 Hashing 'B0' Hashing 'B0' Hashing 'B0' Iterating B1 Hashing 'B1' Hashing 'B1' Hashing 'B1' Iterating B2 Hashing 'B2' Hashing 'B2' Hashing 'B2' Iterating B3 Hashing 'B3' Hashing 'B3' Hashing 'B3' Iterating C0 Hashing 'C0' Hashing 'C0' Iterating C1 Hashing 'C1' Hashing 'C1' Iterating C2 Hashing 'C2' Hashing 'C2' Iterating C3 Hashing 'C3' Hashing 'C3' Iterating D0 Hashing 'D0' Iterating D1 Hashing 'D1' Iterating D2 Hashing 'D2' Iterating D3 Hashing 'D3' --- A.Union(B.Union(C.Union(D))) Iterating A0 Hashing 'A0' Iterating A1 Hashing 'A1' Iterating A2 Hashing 'A2' Iterating A3 Hashing 'A3' Iterating B0 Hashing 'B0' Hashing 'B0' Iterating B1 Hashing 'B1' Hashing 'B1' Iterating B2 Hashing 'B2' Hashing 'B2' Iterating B3 Hashing 'B3' Hashing 'B3' Iterating C0 Hashing 'C0' Hashing 'C0' Hashing 'C0' Iterating C1 Hashing 'C1' Hashing 'C1' Hashing 'C1' Iterating C2 Hashing 'C2' Hashing 'C2' Hashing 'C2' Iterating C3 Hashing 'C3' Hashing 'C3' Hashing 'C3' Iterating D0 Hashing 'D0' Hashing 'D0' Hashing 'D0' Iterating D1 Hashing 'D1' Hashing 'D1' Hashing 'D1' Iterating D2 Hashing 'D2' Hashing 'D2' Hashing 'D2' Iterating D3 Hashing 'D3' Hashing 'D3' Hashing 'D3' --- D.Union(C.Union(B.Union(A))) Iterating D0 Hashing 'D0' Iterating D1 Hashing 'D1' Iterating D2 Hashing 'D2' Iterating D3 Hashing 'D3' Iterating C0 Hashing 'C0' Hashing 'C0' Iterating C1 Hashing 'C1' Hashing 'C1' Iterating C2 Hashing 'C2' Hashing 'C2' Iterating C3 Hashing 'C3' Hashing 'C3' Iterating B0 Hashing 'B0' Hashing 'B0' Hashing 'B0' Iterating B1 Hashing 'B1' Hashing 'B1' Hashing 'B1' Iterating B2 Hashing 'B2' Hashing 'B2' Hashing 'B2' Iterating B3 Hashing 'B3' Hashing 'B3' Hashing 'B3' Iterating A0 Hashing 'A0' Hashing 'A0' Hashing 'A0' Iterating A1 Hashing 'A1' Hashing 'A1' Hashing 'A1' Iterating A2 Hashing 'A2' Hashing 'A2' Hashing 'A2' Iterating A3 Hashing 'A3' Hashing 'A3' Hashing 'A3'