StringBuilder allows you to access and manipulate the characters through their indexes.
string stringToReverse = "abcdefghijk"; var sb = new StringBuilder(stringToReverse); for (int i = 0, j = sb.Length - 1; i < sb.Length / 2; i++, j--) { char temp = sb[i]; sb[i] = sb[j]; sb[j] = temp; // Since C# 7.0 you can use tuples to swap two values: // (sb[i], sb[j]) = (sb[j], sb[i]); } string reversed = sb.ToString();
But I made a Test which shows that @Mendhak's version is faster. One million repetitions with strings of length 100
StringBuilder: 974 ms Mendhak: 209 ms
So on my PC it takes just 209 ns to reverse the string with Mendhak's solution. Just because a solution looks faster it must not be faster. Array.Reverse calls the external method private static extern bool TrySZReverse(Array array, int index, int count); which is highly optimized.
The test:
static class ReverseString { const string stringToReverse = "abcdex.dfkjvhw4o5i8yd,vfjhe4iotuwyflkcjadhrlniqeuyfmln mclf8yuertoicer,tpoirsd,kfngoiw5r8t7ndlrgjhfg"; public static string TestStringBuilder() { var sb = new StringBuilder(stringToReverse); for (int i = 0, j = sb.Length - 1; i < sb.Length / 2; i++, j--) { char temp = sb[i]; sb[i] = sb[j]; sb[j] = temp; } return sb.ToString(); } // By Mendhak public static string TestArrayReverse() { char[] arr = stringToReverse.ToString().ToCharArray(); Array.Reverse(arr); return new string(arr); } public static void Compare() { string result1 = TestStringBuilder(); string result2 = TestArrayReverse(); Console.WriteLine($"Are result1 and 2 equal? {result1 == result2}"); Measure("StringBuilder", TestStringBuilder); Measure("Array.Reverse", TestArrayReverse); Console.ReadKey(); } public static void Measure(string method, Func<string> sut) { const int NTests = 1000000; var stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < NTests; i++) { sut(); } stopWatch.Stop(); Console.WriteLine($"{method} = {stopWatch.ElapsedMilliseconds} ms"); } }
result?