-
Notifications
You must be signed in to change notification settings - Fork 255
Avoid List allocation for PostProcessingAction. #501
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR introduces an AsList
extension to avoid unnecessary list allocations when PostProcessingAction
returns an existing List<T>
, updates null checks to use is null
, and applies AsList
across various evaluators and repository methods.
- Added
CollectionExtensions.AsList
to return the source list if already aList<T>
, otherwise callToList()
. - Replaced
== null
withis null
forPostProcessingAction
checks. - Updated EF Core and EF6
ListAsync
andDbSetExtensions
methods to useAsList
instead of always callingToList()
.
Reviewed Changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Show a summary per file
File | Description |
---|---|
InMemorySpecificationEvaluator.cs | Switched null checks to is null for PostProcessingAction . |
CollectionExtensions.cs | Added AsList extension to reuse existing List<T> . |
RepositoryBaseOfT.cs (EF Core) | Updated to use AsList after post-processing instead of ToList() . |
DbSetExtensions.cs (EF Core) | Updated to use AsList when applying PostProcessingAction . |
ContextFactoryRepositoryBaseOfT.cs | Updated to use AsList after post-processing in factory repo. |
RepositoryBaseOfT.cs (EF6) | Updated to use AsList after post-processing instead of ToList() . |
DbSetExtensions.cs (EF6) | Updated to use AsList when applying PostProcessingAction . |
Comments suppressed due to low confidence (3)
src/Ardalis.Specification/CollectionExtensions.cs:5
- [nitpick] Add an XML doc comment for
AsList<T>
to explain its behavior and intent for future maintainers.
public static List<T> AsList<T>(this IEnumerable<T> source)
src/Ardalis.Specification/CollectionExtensions.cs:7
- Add unit tests for
AsList
to cover both scenarios: whensource
is already aList<T>
and when it is not, verifying that the returned instance and contents are correct.
if (source is List<T> list)
src/Ardalis.Specification/CollectionExtensions.cs:12
- The call to
ToList()
requires theSystem.Linq
namespace; addusing System.Linq;
at the top of this file to ensure it compiles.
return source.ToList();
Added
AsList
extension. If theIEnumerable
source is aList
, we return the list, otherwise, we create a new one.The
PostProcessingAction
is aFunc<IEnumerable<T>, IEnumerable<T>>
delegate. However, users do not always filter the collection; they may just iterate over it and update items. In that case, if the delegate output isList
, we may directly return it instead of allocating a new one.