diff --git a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/RemoveLastCharOfAString.csproj b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/RemoveLastCharOfAString.csproj index 848f901f4f..c96a8eb1e7 100644 --- a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/RemoveLastCharOfAString.csproj +++ b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/RemoveLastCharOfAString.csproj @@ -2,13 +2,13 @@ Exe - net8.0 + net10.0 enable enable - + diff --git a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/TechniquesToRemoveLastChar.cs b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/TechniquesToRemoveLastChar.cs index dc81c934a6..af33222156 100644 --- a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/TechniquesToRemoveLastChar.cs +++ b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAString/TechniquesToRemoveLastChar.cs @@ -2,6 +2,7 @@ using BenchmarkDotNet.Columns; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Order; +using System.Globalization; using System.Text; namespace RemoveLastCharOfAString; @@ -29,6 +30,13 @@ public string RemoveLastCharUsingSubstring(string inputString) return inputString.Substring(0, inputString.Length - 1); } + [Benchmark] + [Arguments(TestString)] + public string RemoveLastCharUsingRange(string inputString) + { + return inputString[..^1]; + } + [Benchmark] [Arguments(TestString)] public string RemoveLastCharUsingLinq(string inputString) @@ -55,7 +63,7 @@ public ReadOnlySpan RemoveLastCharAsSpan(string inputString) [Benchmark] [Arguments(TestString)] - public string RemoveLastCharUsingStringBuilder(string inputString) + public string RemoveLastCharUsingStringBuilderLength(string inputString) { var stringBuilder = new StringBuilder(inputString); --stringBuilder.Length; @@ -63,4 +71,28 @@ public string RemoveLastCharUsingStringBuilder(string inputString) return stringBuilder.ToString(); } + [Benchmark] + [Arguments(TestString)] + public string RemoveLastCharUsingStringBuilderRemove(string inputString) + { + var stringBuilder = new StringBuilder(inputString); + stringBuilder.Remove(stringBuilder.Length - 1, 1); + + return stringBuilder.ToString(); + } + + public static string RemoveLastTextElement(string input) + { + if (input.Length == 0) + return input; + + var enumerator = StringInfo.GetTextElementEnumerator(input); + var lastStart = 0; + + while (enumerator.MoveNext()) + lastStart = enumerator.ElementIndex; + + return input[..lastStart]; + } + } \ No newline at end of file diff --git a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringTests.csproj b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringTests.csproj index 951d3f0041..b38312359f 100644 --- a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringTests.csproj +++ b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 enable enable @@ -10,10 +10,10 @@ - - - - + + + + diff --git a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringUnitTests.cs b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringUnitTests.cs index 0adffadfb0..8d3541a022 100644 --- a/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringUnitTests.cs +++ b/strings-csharp/RemoveLastCharOfAString/RemoveLastCharOfAStringTests/RemoveLastCharOfAStringUnitTests.cs @@ -42,9 +42,9 @@ public void GivenAString_WhenReadOnlySpanUsed_ThenVerifyLastCharRemoved() } [TestMethod] - public void GivenAString_WhenStringBuilderUsed_ThenVerifyLastCharRemoved() + public void GivenAString_WhenStringBuilderLengthUsed_ThenVerifyLastCharRemoved() { - var actualString = _methodInstances.RemoveLastCharUsingStringBuilder(InputString); + var actualString = _methodInstances.RemoveLastCharUsingStringBuilderLength(InputString); Assert.AreEqual(OutputString, actualString); } @@ -56,4 +56,29 @@ public void GivenAString_WhenReturnedAsSpanUsed_ThenVerifyLastCharRemoved() Assert.AreEqual(OutputString, actualSpan.ToString()); } -} \ No newline at end of file + + [TestMethod] + public void GivenAString_WhenRangeOperatorUsed_ThenVerifyLastCharRemoved() + { + var actualString = _methodInstances.RemoveLastCharUsingRange(InputString); + + Assert.AreEqual(OutputString, actualString); + } + + [TestMethod] + public void GivenAString_WhenStringBuilderRemoveUsed_ThenVerifyLastCharRemoved() + { + var actualString = _methodInstances.RemoveLastCharUsingStringBuilderRemove(InputString); + + Assert.AreEqual(OutputString, actualString); + } + + [TestMethod] + public void GivenAStringEndingInAnEmoji_WhenRemoveLastTextElementUsed_ThenVerifyWholeCharacterRemoved() + { + var actualString = TechniquesToRemoveLastChar.RemoveLastTextElement("Hi \U0001F44B"); + + Assert.AreEqual("Hi ", actualString); + Assert.AreEqual(3, actualString.Length); + } +}