Prefer StringComparisons over StringComparers for string comparisons#15000
Prefer StringComparisons over StringComparers for string comparisons#15000JamesNK wants to merge 9 commits intorelease/13.2from
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 15000Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 15000" |
There was a problem hiding this comment.
Pull request overview
Updates string comparison call sites across Hosting/CLI/Dashboard code to use string.Equals / string.Compare with centralized StringComparisons constants, reserving StringComparers for APIs that require IEqualityComparer<string> / IComparer<string>.
Changes:
- Replaces direct equality checks using
StringComparers.*.Equals(a, b)withstring.Equals(a, b, StringComparisons.*)(orStringComparison.*where appropriate). - Replaces direct ordering comparisons using
StringComparers.*.Compare(a, b)withstring.Compare(a, b, StringComparisons.*). - Updates multiple resource/endpoint lookup filters to use
StringComparisons-based comparisons consistently.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/Shared/Model/ResourceSourceViewModel.cs | Switches resource type checks to string.Equals(..., StringComparisons.ResourceType). |
| src/Aspire.Hosting/ResourceBuilderExtensions.cs | Updates endpoint name matching to string.Equals(..., StringComparisons.EndpointAnnotationName). |
| src/Aspire.Hosting/Health/ResourceHealthCheckService.cs | Updates health report change detection to string.Equals(..., StringComparisons.HealthReportPropertyValue). |
| src/Aspire.Hosting/Dcp/DcpExecutor.cs | Updates resource/endpoint matching predicates to string.Equals(..., StringComparisons.*). |
| src/Aspire.Hosting/Dashboard/DashboardEventHandlers.cs | Updates dashboard resource identification checks to string.Equals(..., StringComparisons.ResourceName). |
| src/Aspire.Hosting/BuiltInDistributedApplicationEventSubscriptionHandlers.cs | Updates dashboard resource lookup to string.Equals(..., StringComparisons.ResourceName). |
| src/Aspire.Hosting/Backchannel/DashboardUrlsHelper.cs | Updates dashboard resource lookup to string.Equals(..., StringComparisons.ResourceName). |
| src/Aspire.Hosting/Backchannel/AuxiliaryBackchannelRpcTarget.cs | Updates resource existence checks and dashboard skipping logic to string.Equals(..., StringComparisons.ResourceName). |
| src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs | Updates endpoint lookup by name to string.Equals(..., StringComparisons.EndpointAnnotationName). |
| src/Aspire.Hosting/ApplicationModel/EndpointReference.cs | Updates scheme/name/network matching to string.Equals(..., StringComparisons.*). |
| src/Aspire.Hosting.Redis/RedisBuilderExtensions.cs | Updates endpoint name match to string.Equals(..., StringComparison.OrdinalIgnoreCase). |
| src/Aspire.Hosting.DevTunnels/DevTunnelResourceBuilderExtensions.cs | Updates endpoint name lookups to string.Equals(..., StringComparisons.EndpointAnnotationName). |
| src/Aspire.Dashboard/Model/ResourceViewModelExtensions.cs | Updates resource type checks to string.Equals(..., StringComparisons.ResourceType). |
| src/Aspire.Dashboard/Model/ResourceViewModel.cs | Updates name comparer to string.Compare(..., StringComparisons.ResourceName). |
| src/Aspire.Dashboard/Components/ResourcesGridColumns/ResourceNameDisplay.razor | Updates container lifetime check to string.Equals(..., StringComparison.Ordinal). |
| src/Aspire.Dashboard/Components/Dialogs/SettingsDialog.razor.cs | Updates culture name comparison to string.Equals(..., StringComparisons.CultureName). |
| src/Aspire.Dashboard/Components/Dialogs/ManageDataDialog.razor.cs | Updates selection removal predicate to string.Equals(..., StringComparisons.ResourceName). |
3f4b6dd to
2a1bd0a
Compare
🎬 CLI E2E Test RecordingsThe following terminal recordings are available for commit
📹 Recordings uploaded automatically from CI run #22982760216 |
2a1bd0a to
2ac6d5a
Compare
b1ce73e to
d6bee12
Compare
…perations Replace StringComparer.*.Equals()/Compare() and StringComparers.*.Equals()/Compare() calls with string.Equals()/string.Compare() using StringComparison/StringComparisons. StringComparers should only be used with APIs that require IEqualityComparer<string> or IComparer<string> (e.g., dictionary constructors, OrderBy, GroupBy, HashSet).
d6bee12 to
9013c4f
Compare
This reverts commit d3d08f3.
| "commandName": "Project", | ||
| "launchBrowser": true, | ||
| "environmentVariables": { | ||
| "ASPNETCORE_ENVIRONMENT": "Development", |
joperezr
left a comment
There was a problem hiding this comment.
Other than the launchsettings.json comment, this looks good to go.
Description
Prefer
StringComparisonsoverStringComparersfor direct string comparison operations (Equals,Compare).StringComparersmembers returnStringComparerinstances which should only be used with APIs that requireIEqualityComparer<string>orIComparer<string>— such as dictionary/hashset constructors,OrderBy,GroupBy,ToDictionary,Except, and collectionContains.For direct string equality or comparison checks,
string.Equals()/string.Compare()withStringComparison(viaStringComparisons) is the preferred pattern because it avoids the overhead of the comparer interface dispatch and is more idiomatic.Changes (17 files, 39 replacements)
StringComparer.OrdinalIgnoreCase.Equals(a, b)→string.Equals(a, b, StringComparison.OrdinalIgnoreCase)StringComparers.*.Equals(a, b)→string.Equals(a, b, StringComparisons.*)StringComparers.*.Compare(a, b)→string.Compare(a, b, StringComparisons.*)All remaining
StringComparersusages are correct — they are passed to APIs that requireIEqualityComparer<string>orIComparer<string>.Checklist
<remarks />and<code />elements on your triple slash comments?aspire.devissue: