-
Notifications
You must be signed in to change notification settings - Fork 254
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.AsListto return the source list if already aList<T>, otherwise callToList(). - Replaced
== nullwithis nullforPostProcessingActionchecks. - Updated EF Core and EF6
ListAsyncandDbSetExtensionsmethods to useAsListinstead 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
AsListto cover both scenarios: whensourceis 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.Linqnamespace; addusing System.Linq;at the top of this file to ensure it compiles.
return source.ToList();
Added
AsListextension. If theIEnumerablesource is aList, we return the list, otherwise, we create a new one.The
PostProcessingActionis 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.