perf: replace LINQ in Flatten/AllSucceeded/AnyFailed with for-loops#116
Merged
Conversation
- AllSucceeded / AnyFailed: replace `results.All(...)` / `results.Any(...)`
with index-based for-loops. Eliminates the allocated lambda + iterator
state machine on the hot path.
- Flatten: single-pass scan that short-circuits on the common cases:
- all-success: no allocation, return cached Success() singleton
- single-failure: return the original ErrorMessage with no string.Join
or StringBuilder allocation
- multiple failures: lazily allocate a StringBuilder
Previously LINQ allocated a Where iterator + Select iterator + lambda
closures + invoked string.Join even when there were zero failures.
Behavior unchanged. All 97 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR optimizes core Result aggregation helpers in the Try-Pattern library by removing LINQ from hot paths and replacing it with allocation-free index-based loops, while preserving the existing success/failure semantics and error message formatting.
Changes:
- Replaced LINQ-based implementations of
AnyFailedandAllSucceededwithforloops to avoid iterator/lambda allocations. - Reworked
Result.Flatteninto a single-pass scan that short-circuits the common cases (all success / single failure) and only allocates aStringBuilderwhen multiple failures exist. - Removed the now-unused
System.Linqimport and addedSystem.TextforStringBuilder.
Chris-Wolfgang
commented
May 11, 2026
Chris-Wolfgang
commented
May 11, 2026
Chris-Wolfgang
commented
May 11, 2026
4 tasks
Chris-Wolfgang
added a commit
that referenced
this pull request
May 19, 2026
Changes since v0.3.1: - fix: null-element validation in Result.Flatten / AllSucceeded / AnyFailed (#113) — previously calling `.Failed` on a null element threw NullReferenceException; now throws ArgumentException with the index of the offending element. Adds [NotNull] post-condition attribute to all three methods plus all Try.Run/RunAsync overloads. Polyfills NotNullAttribute for net462 / netstandard2.0. - perf: Result.Success() now returns a cached singleton instead of allocating per call (#114). Behavior is locked in by a test using Assert.Same; XML docs warn callers not to rely on reference identity. - perf: replace LINQ in Flatten / AllSucceeded / AnyFailed with index- based for-loops (#116). Flatten is now single-pass with a lazy StringBuilder so the common single-failure case has zero extra allocation. AllSucceeded / AnyFailed short-circuit on first failure, so a trailing null past the decisive element no longer throws (documented in <exception> XML and locked in by tests). - refactor: simplify Result ctor validation (#115) — switch-when replaced with two guard-clause ifs. No behavior change; exception messages and ParamName preserved. - chore: test cleanup (#117) — remove redundant inheritance- verification tests, fix tabs vs spaces, drop unused pragma. - chore(deps): Bump Meziantou.Analyzer 3.0.77 → 3.0.85 (#118). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
AllSucceeded/AnyFailed: replace LINQAll/Anywith index-basedforloops. Eliminates lambda allocation + iterator state machine on the hot path.Flatten: single-pass scan with short-circuits on the common cases:Success()singleton (once perf: cache Result.Success() singleton #114 lands)ErrorMessagewith nostring.JoinorStringBuilderallocationStringBuilderusing System.Linq;.Behavior unchanged.
Test plan
dotnet build -c Release— 0 warnings, 0 errorsdotnet test -c Release --framework net8.0— 97/97 passing🤖 Generated with Claude Code