From 7e413787a61069c7713b6bff91e291006182b543 Mon Sep 17 00:00:00 2001 From: yv01p Date: Sun, 7 Dec 2025 22:28:29 +0000 Subject: [PATCH] perf: optimize ReplaceNonAlphanumericChars string overload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Single-pass StringBuilder instead of multiple string.Replace calls. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../StringExtensions.Manipulation.cs | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Core/Extensions/StringExtensions.Manipulation.cs b/src/Umbraco.Core/Extensions/StringExtensions.Manipulation.cs index eedd8da969..9cdca7b0f8 100644 --- a/src/Umbraco.Core/Extensions/StringExtensions.Manipulation.cs +++ b/src/Umbraco.Core/Extensions/StringExtensions.Manipulation.cs @@ -269,14 +269,31 @@ public static partial class StringExtensions public static string ReplaceNonAlphanumericChars(this string input, string replacement) { - // any character that is not alphanumeric, convert to a hyphen - var mName = input; - foreach (var c in mName.ToCharArray().Where(c => !char.IsLetterOrDigit(c))) + if (string.IsNullOrEmpty(input)) { - mName = mName.Replace(c.ToString(CultureInfo.InvariantCulture), replacement); + return input; } - return mName; + // Single-char replacement can use the optimized char overload + if (replacement.Length == 1) + { + return input.ReplaceNonAlphanumericChars(replacement[0]); + } + + // Multi-char replacement: single pass with StringBuilder + var sb = new StringBuilder(input.Length); + foreach (var c in input) + { + if (char.IsLetterOrDigit(c)) + { + sb.Append(c); + } + else + { + sb.Append(replacement); + } + } + return sb.ToString(); } public static string ReplaceNonAlphanumericChars(this string input, char replacement)