From 0e367abc3d1e563575fe5510e278edc673042fce Mon Sep 17 00:00:00 2001 From: Vladimir Pecanac Date: Sun, 1 Nov 2026 13:29:38 +0100 Subject: [PATCH] Convert string to char: move to .NET 10, add indexer and TryParse helpers and tests --- ...ConvertingStringToCharArrayInCSharp.csproj | 2 +- .../Program.cs | 11 +++- .../StringHelper.cs | 28 +++++++---- ...rtingStringToCharArrayInCSharpTests.csproj | 10 ++-- .../StringHelperTests.cs | 50 +++++++++++++++++-- 5 files changed, 82 insertions(+), 19 deletions(-) diff --git a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp.csproj b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp.csproj index 2150e3797b..ed9781c223 100644 --- a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp.csproj +++ b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net10.0 enable enable diff --git a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/Program.cs b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/Program.cs index 191cb4da4f..58553e9acf 100644 --- a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/Program.cs +++ b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/Program.cs @@ -8,10 +8,19 @@ char singleChar = StringHelper.ConvertSingleCharacterStringToChar(singleCharString); Console.WriteLine(singleChar); +char firstChar = StringHelper.GetCharacterAtIndex(myString, 0); +char lastChar = myString[^1]; +Console.WriteLine($"{firstChar} {lastChar}"); + +if (StringHelper.TryConvertSingleCharacterStringToChar("AB", out char parsed)) + Console.WriteLine(parsed); +else + Console.WriteLine("Not a single character"); + ReadOnlySpan charArrayReadOnlySpan = StringHelper.ConvertStringToCharArrayUsingReadOnlySpan(myString); PrintArray(charArrayReadOnlySpan); -string[] stringArray = { "C#", "is", "awesome" }; +string[] stringArray = ["C#", "is", "awesome"]; char[] combinedCharArray = StringHelper.ConvertStringArrayToCharArrayUsingLoop(stringArray); PrintArray(combinedCharArray); diff --git a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/StringHelper.cs b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/StringHelper.cs index 57f2a62f03..294ce303c5 100644 --- a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/StringHelper.cs +++ b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharp/StringHelper.cs @@ -19,20 +19,30 @@ public static char ConvertSingleCharacterStringToChar(string inputString) return char.Parse(inputString); } -public static char[] ConvertStringArrayToCharArrayUsingLoop(string[] stringArray) -{ - var combinedString = new StringBuilder(); + public static char GetCharacterAtIndex(string inputString, int index) + { + return inputString[index]; + } - foreach (var str in stringArray) + public static bool TryConvertSingleCharacterStringToChar(string? inputString, out char result) { - combinedString.Append(str); + return char.TryParse(inputString, out result); } - var result = new char[combinedString.Length]; - combinedString.CopyTo(0, result, 0, result.Length); + public static char[] ConvertStringArrayToCharArrayUsingLoop(string[] stringArray) + { + var combinedString = new StringBuilder(); - return result; -} + foreach (var str in stringArray) + { + combinedString.Append(str); + } + + var result = new char[combinedString.Length]; + combinedString.CopyTo(0, result, 0, result.Length); + + return result; + } public static char[] ConvertStringArrayToCharArrayUsingLinq(string[] stringArray) { diff --git a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/ConvertingStringToCharArrayInCSharpTests.csproj b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/ConvertingStringToCharArrayInCSharpTests.csproj index b93b3680e1..1f585b4a46 100644 --- a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/ConvertingStringToCharArrayInCSharpTests.csproj +++ b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/ConvertingStringToCharArrayInCSharpTests.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable @@ -10,13 +10,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/StringHelperTests.cs b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/StringHelperTests.cs index e8fe3ac95f..93cb888237 100644 --- a/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/StringHelperTests.cs +++ b/strings-csharp/ConvertingStringToCharArrayInCSharp/ConvertingStringToCharArrayInCSharpTests/StringHelperTests.cs @@ -42,11 +42,55 @@ public void GivenStringArrayToCharArray_WhenValidInput_ThenReturnsCharArray() Assert.Equal(InputString.ToCharArray(), resultLinq); } + [Theory] + [InlineData("AB")] + [InlineData("")] + public void GivenStringToChar_WhenLengthIsNotOne_ThenThrowsFormatException(string inputString) + { + Assert.Throws(() => StringHelper.ConvertSingleCharacterStringToChar(inputString)); + } + [Fact] - public void GivenStringToChar_WhenInvalidInput_ThenThrowsArgumentException() + public void GivenStringToChar_WhenNull_ThenThrowsArgumentNullException() { - const string inputString = "AB"; + Assert.Throws(() => StringHelper.ConvertSingleCharacterStringToChar(null!)); + } - Assert.Throws(() => StringHelper.ConvertSingleCharacterStringToChar(inputString)); + [Fact] + public void GivenCharacterAtIndex_WhenIndexInRange_ThenReturnsThatChar() + { + Assert.Equal('H', StringHelper.GetCharacterAtIndex(InputString, 0)); + Assert.Equal('W', StringHelper.GetCharacterAtIndex(InputString, 7)); + } + + [Fact] + public void GivenCharacterAtIndex_WhenStringIsEmpty_ThenThrowsIndexOutOfRangeException() + { + Assert.Throws(() => StringHelper.GetCharacterAtIndex(string.Empty, 0)); + } + + [Theory] + [InlineData("A", true)] + [InlineData("AB", false)] + [InlineData("", false)] + [InlineData(null, false)] + public void GivenTryConvert_WhenCalled_ThenReportsSuccessWithoutThrowing(string? inputString, bool expectedSuccess) + { + bool success = StringHelper.TryConvertSingleCharacterStringToChar(inputString, out char result); + + Assert.Equal(expectedSuccess, success); + if (success) + Assert.Equal(inputString![0], result); + } + + [Fact] + public void GivenEmoji_WhenConverted_ThenTwoCharsAndParseFails() + { + const string thumbsUp = "\U0001F44D"; + + Assert.Equal(2, thumbsUp.Length); + Assert.True(char.IsHighSurrogate(StringHelper.GetCharacterAtIndex(thumbsUp, 0))); + Assert.False(StringHelper.TryConvertSingleCharacterStringToChar(thumbsUp, out _)); + Assert.Equal(0x1F44D, System.Text.Rune.GetRuneAt(thumbsUp, 0).Value); } } \ No newline at end of file