{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/36379992","id":36379992,"diff_hunk":"@@ -556,13 +559,25 @@ public ImmutableArray<T> InsertRange(int index, IEnumerable<T> items)\n             }\n \n             T[] tmp = new T[self.Length + count];\n-            Array.Copy(self.array, 0, tmp, 0, index);\n-            int sequenceIndex = index;\n-            foreach (var item in items)\n+            \n+            // CopyTo first in case bad interface impl\n+            // tries to modify other parts of tmp\n+            if (items is ICollection<T>)\n             {\n-                tmp[sequenceIndex++] = item;\n+                ((ICollection<T>)items).CopyTo(tmp, index);","path":"src/System.Collections.Immutable/src/System/Collections/Immutable/ImmutableArray`1.cs","position":43,"original_position":43,"commit_id":"6fad4d324240779e7a22b07b8ea789975dbd67d3","original_commit_id":"6fad4d324240779e7a22b07b8ea789975dbd67d3","user":{"login":"AArnott","id":3548,"avatar_url":"https://avatars.githubusercontent.com/u/3548?v=3","gravatar_id":"","url":"https://api.github.com/users/AArnott","html_url":"https://github.com/AArnott","followers_url":"https://api.github.com/users/AArnott/followers","following_url":"https://api.github.com/users/AArnott/following{/other_user}","gists_url":"https://api.github.com/users/AArnott/gists{/gist_id}","starred_url":"https://api.github.com/users/AArnott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AArnott/subscriptions","organizations_url":"https://api.github.com/users/AArnott/orgs","repos_url":"https://api.github.com/users/AArnott/repos","events_url":"https://api.github.com/users/AArnott/events{/privacy}","received_events_url":"https://api.github.com/users/AArnott/received_events","type":"User","site_admin":false},"body":"You now have two type checks here: the one in the if condition and the type cast here. While there is a *small* perf improvement for only doing the type check once, I doubt it's going to be significant for this method. But I'm more interested in the readability/maintainability of the code if you use `as` for the cast above the `if` line, and then the `if` check can be whether the result is non-null. That way one line of code being changed can't result in accidental `InvalidCastException`s down the road.","created_at":"2015-08-06T04:11:13Z","updated_at":"2015-08-06T04:11:13Z","html_url":"https://github.com/dotnet/corefx/pull/2643#discussion_r36379992","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/2643","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/36379992"},"html":{"href":"https://github.com/dotnet/corefx/pull/2643#discussion_r36379992"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/2643"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/2643","id":41750096,"html_url":"https://github.com/dotnet/corefx/pull/2643","diff_url":"https://github.com/dotnet/corefx/pull/2643.diff","patch_url":"https://github.com/dotnet/corefx/pull/2643.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/2643","number":2643,"state":"open","locked":false,"title":"Use CopyTo where possible in InsertRange","user":{"login":"James-Ko","id":9159214,"avatar_url":"https://avatars.githubusercontent.com/u/9159214?v=3","gravatar_id":"","url":"https://api.github.com/users/James-Ko","html_url":"https://github.com/James-Ko","followers_url":"https://api.github.com/users/James-Ko/followers","following_url":"https://api.github.com/users/James-Ko/following{/other_user}","gists_url":"https://api.github.com/users/James-Ko/gists{/gist_id}","starred_url":"https://api.github.com/users/James-Ko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/James-Ko/subscriptions","organizations_url":"https://api.github.com/users/James-Ko/orgs","repos_url":"https://api.github.com/users/James-Ko/repos","events_url":"https://api.github.com/users/James-Ko/events{/privacy}","received_events_url":"https://api.github.com/users/James-Ko/received_events","type":"User","site_admin":false},"body":"This has been separated from PR #2397: Optimizations for ImmutableArray.\r\n\r\nThe logic has been changed to use `CopyTo` for enumerables that impl <s>`ICollection` and</s> `ICollection<T>`, which includes arrays. This also affects enumerables that don't inherit from them, since while getting the count of an `IEnumerable` we capture it into a `List<T>` (which impls `ICollection<T>`) to avoid enumerating over it more than once.","created_at":"2015-08-06T04:01:53Z","updated_at":"2015-08-06T04:11:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3f7acd08fdc5231cc0c080de861de903247cf47b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/2643/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/2643/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/2643/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/6fad4d324240779e7a22b07b8ea789975dbd67d3","head":{"label":"James-Ko:patch-3","ref":"patch-3","sha":"6fad4d324240779e7a22b07b8ea789975dbd67d3","user":{"login":"James-Ko","id":9159214,"avatar_url":"https://avatars.githubusercontent.com/u/9159214?v=3","gravatar_id":"","url":"https://api.github.com/users/James-Ko","html_url":"https://github.com/James-Ko","followers_url":"https://api.github.com/users/James-Ko/followers","following_url":"https://api.github.com/users/James-Ko/following{/other_user}","gists_url":"https://api.github.com/users/James-Ko/gists{/gist_id}","starred_url":"https://api.github.com/users/James-Ko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/James-Ko/subscriptions","organizations_url":"https://api.github.com/users/James-Ko/orgs","repos_url":"https://api.github.com/users/James-Ko/repos","events_url":"https://api.github.com/users/James-Ko/events{/privacy}","received_events_url":"https://api.github.com/users/James-Ko/received_events","type":"User","site_admin":false},"repo":{"id":37746383,"name":"corefx","full_name":"James-Ko/corefx","owner":{"login":"James-Ko","id":9159214,"avatar_url":"https://avatars.githubusercontent.com/u/9159214?v=3","gravatar_id":"","url":"https://api.github.com/users/James-Ko","html_url":"https://github.com/James-Ko","followers_url":"https://api.github.com/users/James-Ko/followers","following_url":"https://api.github.com/users/James-Ko/following{/other_user}","gists_url":"https://api.github.com/users/James-Ko/gists{/gist_id}","starred_url":"https://api.github.com/users/James-Ko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/James-Ko/subscriptions","organizations_url":"https://api.github.com/users/James-Ko/orgs","repos_url":"https://api.github.com/users/James-Ko/repos","events_url":"https://api.github.com/users/James-Ko/events{/privacy}","received_events_url":"https://api.github.com/users/James-Ko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/James-Ko/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/James-Ko/corefx","forks_url":"https://api.github.com/repos/James-Ko/corefx/forks","keys_url":"https://api.github.com/repos/James-Ko/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/James-Ko/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/James-Ko/corefx/teams","hooks_url":"https://api.github.com/repos/James-Ko/corefx/hooks","issue_events_url":"https://api.github.com/repos/James-Ko/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/James-Ko/corefx/events","assignees_url":"https://api.github.com/repos/James-Ko/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/James-Ko/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/James-Ko/corefx/tags","blobs_url":"https://api.github.com/repos/James-Ko/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/James-Ko/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/James-Ko/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/James-Ko/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/James-Ko/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/James-Ko/corefx/languages","stargazers_url":"https://api.github.com/repos/James-Ko/corefx/stargazers","contributors_url":"https://api.github.com/repos/James-Ko/corefx/contributors","subscribers_url":"https://api.github.com/repos/James-Ko/corefx/subscribers","subscription_url":"https://api.github.com/repos/James-Ko/corefx/subscription","commits_url":"https://api.github.com/repos/James-Ko/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/James-Ko/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/James-Ko/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/James-Ko/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/James-Ko/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/James-Ko/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/James-Ko/corefx/merges","archive_url":"https://api.github.com/repos/James-Ko/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/James-Ko/corefx/downloads","issues_url":"https://api.github.com/repos/James-Ko/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/James-Ko/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/James-Ko/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/James-Ko/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/James-Ko/corefx/labels{/name}","releases_url":"https://api.github.com/repos/James-Ko/corefx/releases{/id}","created_at":"2015-06-19T21:17:21Z","updated_at":"2015-06-19T21:17:40Z","pushed_at":"2015-08-06T03:58:45Z","git_url":"git://github.com/James-Ko/corefx.git","ssh_url":"git@github.com:James-Ko/corefx.git","clone_url":"https://github.com/James-Ko/corefx.git","svn_url":"https://github.com/James-Ko/corefx","homepage":"http://dotnet.github.io/core/","size":25065,"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":"patch-2"}},"base":{"label":"dotnet:master","ref":"master","sha":"c47d44a6f176a6323d095fff1bb9599b818bee33","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}","created_at":"2014-11-06T23:42:48Z","updated_at":"2015-08-06T02:02:25Z","pushed_at":"2015-08-06T04:01:53Z","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/core/","size":56572,"stargazers_count":8168,"watchers_count":8168,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1715,"mirror_url":null,"open_issues_count":529,"forks":1715,"open_issues":529,"watchers":8168,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/2643"},"html":{"href":"https://github.com/dotnet/corefx/pull/2643"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/2643"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/2643/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/2643/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/2643/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/6fad4d324240779e7a22b07b8ea789975dbd67d3"}}}}