From d33228b8bda933080c2c4dd79631d9c40a856119 Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 18 Oct 2026 14:21:29 +0200 Subject: [PATCH] Char array to string: net10.0, working solution file, new tests and a benchmark project The solution file mapped project GUIDs that did not exist, so CI built nothing and ran no tests. Regenerated it with all three projects. Both projects move to net10.0 with MSTest 4.5.1, Microsoft.NET.Test.Sdk 18.11.0 and coverlet.collector 10.1.0. Program.cs uses top-level statements and adds the part-of-array, separator and single-char examples. Five new tests cover them and the null-array behaviour. A BenchmarkDotNet 0.15.8 project compares the constructor, string.Concat and string.Join, and passes command-line args to the runner. --- .../CharArrayToStringBenchmarks.cs | 25 +++++ .../ConvertCharArray2String.Benchmarks.csproj | 14 +++ .../Program.cs | 4 + .../ConvertCharArray2String.sln | 59 +++++++++--- .../ConvertCharArray2String.csproj | 2 +- .../ConvertCharArray2String/Program.cs | 50 +++++----- .../ConvertCharArray2StringTests.csproj | 12 +-- .../ConvertCharArrayTests.cs | 92 +++++++++++++------ 8 files changed, 188 insertions(+), 70 deletions(-) create mode 100644 strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/CharArrayToStringBenchmarks.cs create mode 100644 strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/ConvertCharArray2String.Benchmarks.csproj create mode 100644 strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/Program.cs diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/CharArrayToStringBenchmarks.cs b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/CharArrayToStringBenchmarks.cs new file mode 100644 index 0000000000..d6fa84616b --- /dev/null +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/CharArrayToStringBenchmarks.cs @@ -0,0 +1,25 @@ +using BenchmarkDotNet.Attributes; + +namespace ConvertCharArray2String.Benchmarks; + +[MemoryDiagnoser] +public class CharArrayToStringBenchmarks +{ + private char[] _charArray = []; + + [Params(9, 1000)] + public int Length { get; set; } + + [GlobalSetup] + public void Setup() => + _charArray = Enumerable.Range(0, Length).Select(i => (char)('a' + i % 26)).ToArray(); + + [Benchmark(Baseline = true)] + public string StringConstructor() => new string(_charArray); + + [Benchmark] + public string StringConcat() => string.Concat(_charArray); + + [Benchmark] + public string StringJoin() => string.Join("", _charArray); +} diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/ConvertCharArray2String.Benchmarks.csproj b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/ConvertCharArray2String.Benchmarks.csproj new file mode 100644 index 0000000000..62be4f867f --- /dev/null +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/ConvertCharArray2String.Benchmarks.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/Program.cs b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/Program.cs new file mode 100644 index 0000000000..9d02bda805 --- /dev/null +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.Benchmarks/Program.cs @@ -0,0 +1,4 @@ +using BenchmarkDotNet.Running; +using ConvertCharArray2String.Benchmarks; + +BenchmarkRunner.Run(args: args); diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.sln b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.sln index 1e8030f5cc..7581bf4144 100644 --- a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.sln +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String.sln @@ -1,31 +1,62 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.1.31911.260 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertCharArray2String", "ConvertCharArray2String\ConvertCharArray2String.csproj", "{F21AE7B0-5961-431F-9573-CF567C362730}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertCharArray2String", "ConvertCharArray2String\ConvertCharArray2String.csproj", "{CC387591-8080-46EE-8045-62FB77775F15}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertCharArray2StringTests", "ConvertCharArray2StringTests\ConvertCharArray2StringTests.csproj", "{8359457A-7DEA-438D-9A3B-8725C41729C8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertCharArray2StringTests", "ConvertCharArray2StringTests\ConvertCharArray2StringTests.csproj", "{269D6433-F548-49D7-AE0A-346ADBDEAFF3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConvertCharArray2String.Benchmarks", "ConvertCharArray2String.Benchmarks\ConvertCharArray2String.Benchmarks.csproj", "{9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E526D224-B8CE-4E46-AF6C-AB5A3987323C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E526D224-B8CE-4E46-AF6C-AB5A3987323C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E526D224-B8CE-4E46-AF6C-AB5A3987323C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E526D224-B8CE-4E46-AF6C-AB5A3987323C}.Release|Any CPU.Build.0 = Release|Any CPU - {C1B5D5EE-1714-49E8-BAAA-5A31DA4C852E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1B5D5EE-1714-49E8-BAAA-5A31DA4C852E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1B5D5EE-1714-49E8-BAAA-5A31DA4C852E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1B5D5EE-1714-49E8-BAAA-5A31DA4C852E}.Release|Any CPU.Build.0 = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|x64.ActiveCfg = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|x64.Build.0 = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|x86.ActiveCfg = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Debug|x86.Build.0 = Debug|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|Any CPU.Build.0 = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|x64.ActiveCfg = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|x64.Build.0 = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|x86.ActiveCfg = Release|Any CPU + {CC387591-8080-46EE-8045-62FB77775F15}.Release|x86.Build.0 = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|x64.ActiveCfg = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|x64.Build.0 = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|x86.ActiveCfg = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Debug|x86.Build.0 = Debug|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|Any CPU.Build.0 = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|x64.ActiveCfg = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|x64.Build.0 = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|x86.ActiveCfg = Release|Any CPU + {269D6433-F548-49D7-AE0A-346ADBDEAFF3}.Release|x86.Build.0 = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|x64.Build.0 = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Debug|x86.Build.0 = Debug|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|Any CPU.Build.0 = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|x64.ActiveCfg = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|x64.Build.0 = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|x86.ActiveCfg = Release|Any CPU + {9FF511B2-F0CB-4DD1-9EFF-965E49B7D636}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6A5466CD-321D-46D4-B2B3-1E36EAF17EEC} - EndGlobalSection EndGlobal diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/ConvertCharArray2String.csproj b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/ConvertCharArray2String.csproj index 74abf5c976..dfb40caafc 100644 --- a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/ConvertCharArray2String.csproj +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/ConvertCharArray2String.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net10.0 enable enable diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/Program.cs b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/Program.cs index e53ca9e642..de5f5e0482 100644 --- a/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/Program.cs +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2String/Program.cs @@ -1,23 +1,27 @@ -using System.Text; - -namespace ConvertCharArray2String -{ - public class Program - { - public static void Main(string[] args) - { - char[] charArray = { 'c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e' }; - - var convertedToString = new string(charArray); - Console.WriteLine(convertedToString); - - var joinedToString = string.Join("", charArray); - Console.WriteLine(joinedToString); - - var concatedToString = string.Concat(charArray); - Console.WriteLine(concatedToString); - - Console.ReadLine(); - } - } -} \ No newline at end of file +char[] charArray = ['c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e']; + +var convertedToString = new string(charArray); + +Console.WriteLine(convertedToString); + +var partOfArray = new string(charArray, 0, 4); + +Console.WriteLine(partOfArray); + +var joinedToString = string.Join("", charArray); + +Console.WriteLine(joinedToString); + +var withDashes = string.Join("-", charArray); + +Console.WriteLine(withDashes); + +var concatedToString = string.Concat(charArray); + +Console.WriteLine(concatedToString); + +char letter = 'c'; + +var fromChar = letter.ToString(); + +Console.WriteLine(fromChar); diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArray2StringTests.csproj b/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArray2StringTests.csproj index f72bee824b..560313bf07 100644 --- a/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArray2StringTests.csproj +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArray2StringTests.csproj @@ -1,17 +1,17 @@ - net6.0 + net10.0 + enable enable - false - - - - + + + + diff --git a/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArrayTests.cs b/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArrayTests.cs index b3b00f6bed..c8b93cccbd 100644 --- a/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArrayTests.cs +++ b/strings-csharp/ConvertCharArray2String/ConvertCharArray2StringTests/ConvertCharArrayTests.cs @@ -1,38 +1,78 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace ConvertCharArray2StringTests +namespace ConvertCharArray2StringTests; + +[TestClass] +public class ConvertCharArrayTests { - [TestClass] - public class ConvertCharArrayTests + private readonly char[] _charArray = ['c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e']; + + [TestMethod] + public void GivenCharArray_WhenConvertedByConstructor_ThenReturnString() + { + var convertedToString = new string(_charArray); + + Assert.AreEqual("code maze", convertedToString); + } + + [TestMethod] + public void GivenCharArray_WhenConvertedByJoin_ThenReturnString() + { + var joinedToString = string.Join("", _charArray); + + Assert.AreEqual("code maze", joinedToString); + } + + [TestMethod] + public void GivenCharArray_WhenConvertedByConcat_ThenReturnString() + { + var concatedToString = string.Concat(_charArray); + + Assert.AreEqual("code maze", concatedToString); + } + + [TestMethod] + public void GivenCharArray_WhenConvertedByConstructorWithRange_ThenReturnPartOfString() { - [TestMethod] - public void GivenCharArray_WhenConvertedByConstructor_ThenReturnString() - { - char[] charArray = { 'c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e' }; + var partOfArray = new string(_charArray, 0, 4); - var convertedToString = new string(charArray); - - Assert.AreEqual("code maze", convertedToString); - } + Assert.AreEqual("code", partOfArray); + } - [TestMethod] - public void GivenCharArray_WhenConvertedByJoin_ThenReturnString() - { - char[] charArray = { 'c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e' }; + [TestMethod] + public void GivenSingleChar_WhenConvertedByToString_ThenReturnString() + { + char letter = 'c'; - var joinedToString = string.Join("", charArray); + var fromChar = letter.ToString(); - Assert.AreEqual("code maze", joinedToString); - } + Assert.AreEqual("c", fromChar); + } - [TestMethod] - public void GivenCharArray_WhenConvertedByConcat_ThenReturnString() - { - char[] charArray = { 'c', 'o', 'd', 'e', ' ', 'm', 'a', 'z', 'e' }; + [TestMethod] + public void GivenCharArray_WhenJoinedWithSeparator_ThenReturnSeparatedString() + { + var withDashes = string.Join("-", _charArray); + + Assert.AreEqual("c-o-d-e- -m-a-z-e", withDashes); + } - var concatedToString = string.Concat(charArray); + [TestMethod] + public void GivenNullCharArray_WhenConvertedByConstructor_ThenReturnEmptyString() + { + char[]? nothing = null; + + var convertedToString = new string(nothing); + + Assert.AreEqual(string.Empty, convertedToString); + } + + [TestMethod] + public void GivenNullCharArray_WhenConvertedByConcatOrJoin_ThenThrowArgumentNullException() + { + char[]? nothing = null; - Assert.AreEqual("code maze", concatedToString); - } + Assert.ThrowsExactly(() => string.Concat(nothing!)); + Assert.ThrowsExactly(() => string.Join("", nothing!)); } -} \ No newline at end of file +}