บทความนี้เน้นการสร้าง Reusable Method สำหรับ Reverse String
Method Implementation
public static string ReverseString(string input) {
if (string.IsNullOrEmpty(input)) return input;
char[] chars = input.ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
Alternative Implementations
LINQ (สั้น)
public static string ReverseLinq(string input)
=> string.IsNullOrEmpty(input) ? input : new string(input.Reverse().ToArray());
StringBuilder (ประสิทธิภาพ)
public static string ReverseStringBuilder(string input) {
if (string.IsNullOrEmpty(input)) return input;
var sb = new System.Text.StringBuilder(input.Length);
for (int i = input.Length - 1; i >= 0; i--) {
sb.Append(input[i]);
}
return sb.ToString();
}
Span (C# 7.2+, Zero Allocation สำหรับ In-place)
public static void ReverseInPlace(Span span) {
for (int i = 0, j = span.Length - 1; i < j; i++, j--) {
(span[i], span[j]) = (span[j], span[i]);
}
}
// Usage
string s = "Hello";
ReverseInPlace(s.AsSpan()); // s = "olleH" (Mutates Original!)
ตัวอย่างการใช้งาน Method
using System;
class Program {
static void Main() {
string original = "Henry";
string reversed = ReverseString(original);
Console.WriteLine($"Original: {original}"); // Henry
Console.WriteLine($"Reversed: {reversed}"); // ynreH
// Test Edge Cases
Console.WriteLine(ReverseString("")); // ""
Console.WriteLine(ReverseString("A")); // "A"
Console.WriteLine(ReverseString("AB")); // "BA"
Console.WriteLine(ReverseString(null)); // null
Console.ReadKey();
}
public static string ReverseString(string input) {
if (string.IsNullOrEmpty(input)) return input;
char[] chars = input.ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
}
Benchmark (ประมาณ)
| Method | Speed | Allocations | Note |
|---|---|---|---|
| Array.Reverse | Fast | 1 Array + 1 String | Balanced |
| LINQ Reverse | Medium | Multiple | Concise |
| StringBuilder | Fastest (Long) | 1 StringBuilder + 1 String | Best for Long Strings |
| Span In-place | Fastest | Zero (Mutates) | Mutable Context Only |
Unicode / Grapheme Clusters
⚠️ Reverse() กลับ Char (UTF-16 Code Units) ไม่ใช่ Grapheme Clusters (User-perceived Characters)
string flag = "👨👩👧👦"; // Family Emoji = Multiple Code Units
// Reverse ด้วย Array.Reverse จะทำลาย Emoji
สำหรับ Unicode จริง ใช้ StringInfo.GetTextElementEnumerator หรือ Library เช่น NodaTime / ICU