From 1bac4afc9bfd023cb574f5e3d537de7c315c7dec Mon Sep 17 00:00:00 2001 From: prozolic <42107886+prozolic@users.noreply.github.com> Date: Sat, 31 Jan 2026 06:01:27 +0900 Subject: [PATCH] Use Dictionary.TryAdd instead of ContainsKey and indexer by reducing lookups. (#917) * Use Dictionary.TryAdd instead of ContainsKey and indexer by reducing lookups. * Update src/Markdig/Parsers/ParserList.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Markdig/Helpers/CharacterMap.cs | 5 +--- src/Markdig/Parsers/ParserList.cs | 5 ++-- src/Markdig/Polyfills/DictionaryExtensions.cs | 23 +++++++++++++++++++ .../Syntax/LinkReferenceDefinitionGroup.cs | 5 +--- 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 src/Markdig/Polyfills/DictionaryExtensions.cs diff --git a/src/Markdig/Helpers/CharacterMap.cs b/src/Markdig/Helpers/CharacterMap.cs index 73ed3322..a33562ec 100644 --- a/src/Markdig/Helpers/CharacterMap.cs +++ b/src/Markdig/Helpers/CharacterMap.cs @@ -51,10 +51,7 @@ public sealed class CharacterMap where T : class { nonAsciiMap ??= []; - if (!nonAsciiMap.ContainsKey(openingChar)) - { - nonAsciiMap[openingChar] = state.Value; - } + nonAsciiMap.TryAdd(openingChar, state.Value); } } diff --git a/src/Markdig/Parsers/ParserList.cs b/src/Markdig/Parsers/ParserList.cs index ec0db494..3d52ee5b 100644 --- a/src/Markdig/Parsers/ParserList.cs +++ b/src/Markdig/Parsers/ParserList.cs @@ -38,11 +38,10 @@ public abstract class ParserList : OrderedList where T : notnull, { foreach (var openingChar in parser.OpeningCharacters) { - if (!charCounter.ContainsKey(openingChar)) + if (!charCounter.TryAdd(openingChar, 1)) { - charCounter[openingChar] = 0; + charCounter[openingChar]++; } - charCounter[openingChar]++; } } else diff --git a/src/Markdig/Polyfills/DictionaryExtensions.cs b/src/Markdig/Polyfills/DictionaryExtensions.cs new file mode 100644 index 00000000..fbf6f2a4 --- /dev/null +++ b/src/Markdig/Polyfills/DictionaryExtensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) Alexandre Mutel. All rights reserved. +// This file is licensed under the BSD-Clause 2 license. +// See the license.txt file in the project root for more information. + +#if !(NETSTANDARD2_1_OR_GREATER || NET) + +namespace System.Collections.Generic; + +internal static class DictionaryExtensions +{ + public static bool TryAdd(this Dictionary dictionary, TKey key, TValue value) where TKey : notnull + { + if (!dictionary.ContainsKey(key)) + { + dictionary[key] = value; + return true; + } + + return false; + } +} + +#endif diff --git a/src/Markdig/Syntax/LinkReferenceDefinitionGroup.cs b/src/Markdig/Syntax/LinkReferenceDefinitionGroup.cs index 9f79636a..b942ab6e 100644 --- a/src/Markdig/Syntax/LinkReferenceDefinitionGroup.cs +++ b/src/Markdig/Syntax/LinkReferenceDefinitionGroup.cs @@ -40,10 +40,7 @@ public class LinkReferenceDefinitionGroup : ContainerBlock if (!Contains(link)) { Add(link); - if (!Links.ContainsKey(label)) - { - Links[label] = link; - } + Links.TryAdd(label, link); } }