Skip to content

Snapshot AddFrom's items so a collection can add from itself [patch] - #168

Merged
matt-edmondson merged 1 commit into
mainfrom
fix/167-addfrom-self-alias
Oct 18, 2026
Merged

matt-edmondson merged 1 commit into
mainfrom
fix/167-addfrom-self-alias

Conversation

@matt-edmondson

Copy link
Copy Markdown
Contributor

Fixes #167

Problem

CollectionExtensions.AddFrom enumerated items while adding to collection. When items was the collection itself, or a lazy query over it, the first Add invalidated the enumerator:

List<int> l = [1, 2];
l.AddFrom(l);                    // InvalidOperationException: Collection was modified
l.AddFrom(l.Where(x => x > 0));  // same

List<T>.AddRange(l) handles the same call and produces [1, 2, 1, 2].

Change

AddFrom now materialises items into an array before adding any of them. That is the same snapshot ReplaceWith already takes for the same aliasing case (#132). The snapshot is unconditional, because a lazy query over the target can't be detected from its type.

Tests

  • AddFromItselfDoublesTheCollection: l.AddFrom(l) gives [1, 2, 1, 2].
  • AddFromALazyQueryOverItselfAddsTheQueriedItems: l.AddFrom(l.Where(x => x > 0)) gives [1, 2, 1, 2].

With the fix reverted, both tests fail. With it in place, the full suite passes: 200 tests, 0 failed.


Generated by Claude Code

AddFrom enumerated items while adding to collection, so l.AddFrom(l) or
l.AddFrom(l.Where(...)) threw "Collection was modified" on the first Add,
where List.AddRange(l) doubles the list. The items are now materialised
before any are added, matching what ReplaceWith already does.

Fixes #167

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CRjG9vX7hK9TShFL3iJh3
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

list.AddFrom(list) throws InvalidOperationException ("Collection was modified") where List<T>.AddRange(list) doubles the list

2 participants