Use Dictionary with StringComparer to avoid string allocations in System.Data.Common #120603
+1
−3
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.
Issue
System.Data.Common.ADP
internal helper class hasBuildSchemaTableInfoTableNames
method that callsToLowerInvariant
on astring
in a loop only to perform a dictionary lookup.Suggested fix
Using
Dictionary<K, V>
withStringComparer.InvariantCultureIgnoreCase
can avoid multiplestring
allocations in that method.How issue was found
I came up with an idea of an analyzer that would look for
Dictionary<string, TValue>
lookups and find cases when a string allocation is made only to perform a lookup. In such a case an analyzer could recommend usingDictionary<K, V>.GetAlternateLookup<ReadOnlySpan<char>>
to avoid an allocation. I prototyped such an analyzer and ran it as a standalone analysis tool against projects that are part ofsrc/libraries/sfx.slnx
solution. This is how I found this code. And in this particular case, I actually realized it should be even easier to fix by usingStringComparer
. This could probably be a second rule in the same analyzer.Analyzer proposal
[I'll provide a link to the proposal shortly]