{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/53227145","id":53227145,"diff_hunk":"@@ -59,69 +91,52 @@ private bool GetNext()\n                 return false;\n             }\n \n-            public override bool MoveNext()\n+            public sealed override bool MoveNext()\n             {\n-                switch(state)\n+                if (state == 1)\n                 {\n-                    case 1:\n-                        _enumerator = _first.GetEnumerator();\n-                        if (_enumerator.MoveNext())\n-                        {\n-                            state = 2;\n-                        }\n-                        else\n+                    for (IEnumerable<TSource> enumerable = GetEnumerable(0); enumerable != null; enumerable = GetEnumerable(state - 1))\n+                    {\n+                        IEnumerator<TSource> enumerator = enumerable.GetEnumerator();\n+                        ++state;\n+                        if (enumerator.MoveNext())\n                         {\n-                            _enumerator.Dispose();\n-                            _enumerator = _second.GetEnumerator();\n-                            if (!_enumerator.MoveNext())\n-                            {\n-                                Dispose();\n-                                return false;\n-                            }\n-                            state = 3;\n-                        }\n-                        TSource element = _enumerator.Current;\n-                        _set = new Set<TSource>(_comparer);\n-                        _set.Add(element);\n-                        current = element;\n-                        return true;\n-                    case 2:\n-                        if (GetNext())\n+                            SetEnumerator(enumerator);\n+                            StoreFirst();\n                             return true;\n-                        _enumerator.Dispose();\n-                        _enumerator = _second.GetEnumerator();\n-                        state = 3;\n-                        goto case 3;\n-                    case 3:\n+                        }\n+                    }\n+                }\n+                else if (state > 0)\n+                {\n+                    for (;;)\n+                    {\n                         if (GetNext())\n                             return true;\n-                        break;\n+                        IEnumerable<TSource> enumerable = GetEnumerable(state - 1);\n+                        if (enumerable == null)\n+                            break;\n+                        SetEnumerator(enumerable.GetEnumerator());\n+                        ++state;\n+                    }\n                 }\n \n                 Dispose();\n                 return false;\n             }\n \n-            public override void Dispose()\n-            {\n-                if (_enumerator != null)\n-                {\n-                    _enumerator.Dispose();\n-                    _enumerator = null;\n-                    _set = null;\n-                }\n-\n-                base.Dispose();\n-            }\n-\n             private Set<TSource> FillSet()\n             {\n                 Set<TSource> set = new Set<TSource>(_comparer);\n-                foreach (TSource element in _first)\n-                    set.Add(element);\n-                foreach (TSource element in _second)\n-                    set.Add(element);\n-                return set;\n+                for (int index = 0; ; ++index)\n+                {\n+                    IEnumerable<TSource> enumerable = GetEnumerable(index);\n+                    if (enumerable == null)\n+                        return set;\n+\n+                    foreach (TSource item in enumerable)","path":"src/System.Linq/src/System/Linq/Union.cs","position":180,"original_position":180,"commit_id":"f7211f64b4528f93c88fe1528f6615cca94914d8","original_commit_id":"f7211f64b4528f93c88fe1528f6615cca94914d8","user":{"login":"stephentoub","id":2642209,"avatar_url":"https://avatars.githubusercontent.com/u/2642209?v=3","gravatar_id":"","url":"https://api.github.com/users/stephentoub","html_url":"https://github.com/stephentoub","followers_url":"https://api.github.com/users/stephentoub/followers","following_url":"https://api.github.com/users/stephentoub/following{/other_user}","gists_url":"https://api.github.com/users/stephentoub/gists{/gist_id}","starred_url":"https://api.github.com/users/stephentoub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephentoub/subscriptions","organizations_url":"https://api.github.com/users/stephentoub/orgs","repos_url":"https://api.github.com/users/stephentoub/repos","events_url":"https://api.github.com/users/stephentoub/events{/privacy}","received_events_url":"https://api.github.com/users/stephentoub/received_events","type":"User","site_admin":false},"body":"I see.  We'll only ever get a UnionNIterator if it matches the comparers all the way back up to the root Union2Iterator, and if a Union2Iterator is created off another Union2Iterator, the previous one is opaque to it and won't have its enumerables returned from the latter's GetEnumerable. Ok.","created_at":"2016-02-17T20:35:20Z","updated_at":"2016-02-17T20:35:20Z","html_url":"https://github.com/dotnet/corefx/pull/6157#discussion_r53227145","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/6157","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/53227145"},"html":{"href":"https://github.com/dotnet/corefx/pull/6157#discussion_r53227145"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6157"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/6157","id":59594485,"html_url":"https://github.com/dotnet/corefx/pull/6157","diff_url":"https://github.com/dotnet/corefx/pull/6157.diff","patch_url":"https://github.com/dotnet/corefx/pull/6157.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/6157","number":6157,"state":"open","locked":false,"title":"Improve performance of chained Union operations.","user":{"login":"JonHanna","id":1253369,"avatar_url":"https://avatars.githubusercontent.com/u/1253369?v=3","gravatar_id":"","url":"https://api.github.com/users/JonHanna","html_url":"https://github.com/JonHanna","followers_url":"https://api.github.com/users/JonHanna/followers","following_url":"https://api.github.com/users/JonHanna/following{/other_user}","gists_url":"https://api.github.com/users/JonHanna/gists{/gist_id}","starred_url":"https://api.github.com/users/JonHanna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JonHanna/subscriptions","organizations_url":"https://api.github.com/users/JonHanna/orgs","repos_url":"https://api.github.com/users/JonHanna/repos","events_url":"https://api.github.com/users/JonHanna/events{/privacy}","received_events_url":"https://api.github.com/users/JonHanna/received_events","type":"User","site_admin":false},"body":"While not as common as chained Concat, chained Union operations are sometimes needed when combining different sources. This applies a cut-down version of the improvements made to concat in this regard, though only considering the 2-source union (first call) and n-source unions (all subsequent calls) rather than specialising further.\r\n\r\nActing on the union now requires only one hash set to be created and filled, rather than allocating and filling one for each call to `Union()`.","created_at":"2016-02-17T04:17:46Z","updated_at":"2016-02-17T20:35:20Z","closed_at":null,"merged_at":null,"merge_commit_sha":"514084cf49e073f8d10829c344726293ead0b49b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/6157/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/6157/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/6157/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/f7211f64b4528f93c88fe1528f6615cca94914d8","head":{"label":"JonHanna:union_of_union","ref":"union_of_union","sha":"f7211f64b4528f93c88fe1528f6615cca94914d8","user":{"login":"JonHanna","id":1253369,"avatar_url":"https://avatars.githubusercontent.com/u/1253369?v=3","gravatar_id":"","url":"https://api.github.com/users/JonHanna","html_url":"https://github.com/JonHanna","followers_url":"https://api.github.com/users/JonHanna/followers","following_url":"https://api.github.com/users/JonHanna/following{/other_user}","gists_url":"https://api.github.com/users/JonHanna/gists{/gist_id}","starred_url":"https://api.github.com/users/JonHanna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JonHanna/subscriptions","organizations_url":"https://api.github.com/users/JonHanna/orgs","repos_url":"https://api.github.com/users/JonHanna/repos","events_url":"https://api.github.com/users/JonHanna/events{/privacy}","received_events_url":"https://api.github.com/users/JonHanna/received_events","type":"User","site_admin":false},"repo":{"id":38018243,"name":"corefx","full_name":"JonHanna/corefx","owner":{"login":"JonHanna","id":1253369,"avatar_url":"https://avatars.githubusercontent.com/u/1253369?v=3","gravatar_id":"","url":"https://api.github.com/users/JonHanna","html_url":"https://github.com/JonHanna","followers_url":"https://api.github.com/users/JonHanna/followers","following_url":"https://api.github.com/users/JonHanna/following{/other_user}","gists_url":"https://api.github.com/users/JonHanna/gists{/gist_id}","starred_url":"https://api.github.com/users/JonHanna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JonHanna/subscriptions","organizations_url":"https://api.github.com/users/JonHanna/orgs","repos_url":"https://api.github.com/users/JonHanna/repos","events_url":"https://api.github.com/users/JonHanna/events{/privacy}","received_events_url":"https://api.github.com/users/JonHanna/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/JonHanna/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":true,"url":"https://api.github.com/repos/JonHanna/corefx","forks_url":"https://api.github.com/repos/JonHanna/corefx/forks","keys_url":"https://api.github.com/repos/JonHanna/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JonHanna/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JonHanna/corefx/teams","hooks_url":"https://api.github.com/repos/JonHanna/corefx/hooks","issue_events_url":"https://api.github.com/repos/JonHanna/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/JonHanna/corefx/events","assignees_url":"https://api.github.com/repos/JonHanna/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/JonHanna/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/JonHanna/corefx/tags","blobs_url":"https://api.github.com/repos/JonHanna/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JonHanna/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JonHanna/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/JonHanna/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JonHanna/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/JonHanna/corefx/languages","stargazers_url":"https://api.github.com/repos/JonHanna/corefx/stargazers","contributors_url":"https://api.github.com/repos/JonHanna/corefx/contributors","subscribers_url":"https://api.github.com/repos/JonHanna/corefx/subscribers","subscription_url":"https://api.github.com/repos/JonHanna/corefx/subscription","commits_url":"https://api.github.com/repos/JonHanna/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/JonHanna/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/JonHanna/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/JonHanna/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/JonHanna/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/JonHanna/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JonHanna/corefx/merges","archive_url":"https://api.github.com/repos/JonHanna/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JonHanna/corefx/downloads","issues_url":"https://api.github.com/repos/JonHanna/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/JonHanna/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/JonHanna/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/JonHanna/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JonHanna/corefx/labels{/name}","releases_url":"https://api.github.com/repos/JonHanna/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/JonHanna/corefx/deployments","created_at":"2015-06-25T00:19:13Z","updated_at":"2016-01-12T23:30:27Z","pushed_at":"2016-02-17T20:10:26Z","git_url":"git://github.com/JonHanna/corefx.git","ssh_url":"git@github.com:JonHanna/corefx.git","clone_url":"https://github.com/JonHanna/corefx.git","svn_url":"https://github.com/JonHanna/corefx","homepage":"http://dotnet.github.io/core/","size":56156,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"9a12a4c92c265c582c8b199a849c0c674034e337","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/corefx/deployments","created_at":"2014-11-06T23:42:48Z","updated_at":"2016-02-17T18:42:17Z","pushed_at":"2016-02-17T20:19:50Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"http://dotnet.github.io/","size":65979,"stargazers_count":9139,"watchers_count":9139,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2132,"mirror_url":null,"open_issues_count":828,"forks":2132,"open_issues":828,"watchers":9139,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6157"},"html":{"href":"https://github.com/dotnet/corefx/pull/6157"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/6157"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/6157/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6157/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/6157/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/f7211f64b4528f93c88fe1528f6615cca94914d8"}}}}