From 81254c12f99e33ead8a013630b5f9540b4bcb47b Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Tue, 26 May 2026 15:46:19 -0500 Subject: [PATCH] chore(sonar): prefer TryGetValue over ContainsKey+indexer (CA1854) Applied via `dotnet format analyzers --diagnostics CA1854 --severity info`. Eliminates the duplicate hash lookup in the `if (d.ContainsKey(k)) d[k]++ else d[k] = 1` pattern. The fixer rewrites the conditional to `if (d.TryGetValue(k, out var value)) d[k] = ++value;` which is semantically identical but does the lookup once. 4 files touched. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Analyzers/QueryCollectionAnalyzer.cs | 8 ++++---- .../Statements/StatementParser.cs | 6 ++---- .../Statements/StatementParser.cs | 4 ++-- .../Expressions/InputPropertyExpression.cs | 4 +--- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Strata.SqlTools.LinqToSql/Analyzers/QueryCollectionAnalyzer.cs b/src/Strata.SqlTools.LinqToSql/Analyzers/QueryCollectionAnalyzer.cs index d692287..77fccb9 100644 --- a/src/Strata.SqlTools.LinqToSql/Analyzers/QueryCollectionAnalyzer.cs +++ b/src/Strata.SqlTools.LinqToSql/Analyzers/QueryCollectionAnalyzer.cs @@ -186,9 +186,9 @@ public class QueryCollectionAnalyzer var table = query.FromClause?.Clause?.Trim(); if (!string.IsNullOrWhiteSpace(table)) { - if (tableUsage.ContainsKey(table)) + if (tableUsage.TryGetValue(table, out int value)) { - tableUsage[table]++; + tableUsage[table] = ++value; } else { @@ -221,9 +221,9 @@ public class QueryCollectionAnalyzer foreach (var col in columns) { var columnName = col.Trim(); - if (columnUsage.ContainsKey(columnName)) + if (columnUsage.TryGetValue(columnName, out int value)) { - columnUsage[columnName]++; + columnUsage[columnName] = ++value; } else { diff --git a/src/Strata.SqlTools.PostgreSql/Statements/StatementParser.cs b/src/Strata.SqlTools.PostgreSql/Statements/StatementParser.cs index 8727e3f..444f2be 100644 --- a/src/Strata.SqlTools.PostgreSql/Statements/StatementParser.cs +++ b/src/Strata.SqlTools.PostgreSql/Statements/StatementParser.cs @@ -113,9 +113,8 @@ public class StatementParser : SqlServerStatementParser // PostgreSQL-specific: Append LIMIT/OFFSET to ORDER BY if present var orderByClause = clauses.OrderByClause?.Clause ?? string.Empty; - if (clausePositions.ContainsKey(KeywordLimit)) + if (clausePositions.TryGetValue(KeywordLimit, out int limitStart)) { - var limitStart = clausePositions[KeywordLimit]; var limitEnd = clausePositions.Values .Where(v => v > limitStart) .Order() @@ -127,9 +126,8 @@ public class StatementParser : SqlServerStatementParser : $"{orderByClause} {limitClause}"; } - if (clausePositions.ContainsKey(KeywordOffset)) + if (clausePositions.TryGetValue(KeywordOffset, out int offsetStart)) { - var offsetStart = clausePositions[KeywordOffset]; var offsetEnd = clausePositions.Values .Where(v => v > offsetStart) .Order() diff --git a/src/Strata.SqlTools.Snowflake/Statements/StatementParser.cs b/src/Strata.SqlTools.Snowflake/Statements/StatementParser.cs index 0feb85f..def7770 100644 --- a/src/Strata.SqlTools.Snowflake/Statements/StatementParser.cs +++ b/src/Strata.SqlTools.Snowflake/Statements/StatementParser.cs @@ -119,9 +119,9 @@ public class StatementParser : SqlServerStatementParser protected override void PostProcessClauses(SqlClauses clauses, string sql, Dictionary clausePositions) { // Snowflake-specific: Append LIMIT to ORDER BY if present - if (clausePositions.ContainsKey(KeywordLimit)) + if (clausePositions.TryGetValue(KeywordLimit, out int value)) { - var limitClause = sql.Substring(clausePositions[KeywordLimit]).Trim(); + var limitClause = sql.Substring(value).Trim(); if (clauses.OrderByClause != null) { clauses.OrderByClause.Clause = string.IsNullOrEmpty(clauses.OrderByClause.Clause) diff --git a/src/Strata.SqlTools.SqlBreakdown/Expressions/InputPropertyExpression.cs b/src/Strata.SqlTools.SqlBreakdown/Expressions/InputPropertyExpression.cs index fd53385..013c9b4 100644 --- a/src/Strata.SqlTools.SqlBreakdown/Expressions/InputPropertyExpression.cs +++ b/src/Strata.SqlTools.SqlBreakdown/Expressions/InputPropertyExpression.cs @@ -271,15 +271,13 @@ public static class FlatDataUtils { ArgumentNullException.ThrowIfNull(data); - if (!data.ContainsKey(key)) + if (!data.TryGetValue(key, out object? rawValue)) { throw new ArgumentException( $"The specified key is not available. Requested key: [{key}] Available keys: [{string.Join(", ", data.Keys)}]", nameof(key)); } - var rawValue = data[key]; - return rawValue; }