Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using BenchmarkDotNet.Columns;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Order;
using System.Globalization;
using System.Text;

namespace RemoveLastCharOfAString;
Expand Down Expand Up @@ -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)
Expand All @@ -55,12 +63,36 @@ public ReadOnlySpan<char> RemoveLastCharAsSpan(string inputString)

[Benchmark]
[Arguments(TestString)]
public string RemoveLastCharUsingStringBuilder(string inputString)
public string RemoveLastCharUsingStringBuilderLength(string inputString)
{
var stringBuilder = new StringBuilder(inputString);
--stringBuilder.Length;

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];
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
<PackageReference Include="coverlet.collector" Version="10.0.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.10.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.4.0" />
<PackageReference Include="MSTest.TestFramework" Version="4.4.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -56,4 +56,29 @@ public void GivenAString_WhenReturnedAsSpanUsed_ThenVerifyLastCharRemoved()

Assert.AreEqual(OutputString, actualSpan.ToString());
}
}

[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);
}
}
Loading