หลักการ: ใช้ String Concatenation และ Substring
เนื่องจาก String ใน C# เป็น Immutable (ไม่เปลี่ยนแปลงได้) การ "สลับ" จริงๆ คือการสร้าง String ใหม่และกำหนด Reference ใหม่
อัลกอริทึม
str1 = str1 + str2;- รวมสตริงทั้งสอง (str1 = "BradPitt")str2 = str1.Substring(0, str1.Length - str2.Length);- ตัดส่วนแรกได้ "Brad"str1 = str1.Substring(str2.Length);- ตัดส่วนท้ายได้ "Pitt"
โค้ดตัวอย่างสมบูรณ์
using System;
class Demo {
public static void Main(String[] args) {
String str1 = "Brad";
String str2 = "Pitt";
Console.WriteLine("Strings before swap:");
Console.WriteLine($"str1 = '{str1}'");
Console.WriteLine($"str2 = '{str2}'");
// ขั้นตอนที่ 1: รวมสตริง
str1 = str1 + str2; // "BradPitt"
// ขั้นตอนที่ 2: ตัดส่วนแรกให้ str2 (ความยาว str1 ลบความยาว str2 เดิม)
str2 = str1.Substring(0, str1.Length - str2.Length); // "Brad"
// ขั้นตอนที่ 3: ตัดส่วนท้ายให้ str1
str1 = str1.Substring(str2.Length); // "Pitt"
Console.WriteLine("\nStrings after swap:");
Console.WriteLine($"str1 = '{str1}'");
Console.WriteLine($"str2 = '{str2}'");
}
}
ผลลัพธ์
Strings before swap:
str1 = 'Brad'
str2 = 'Pitt'
Strings after swap:
str1 = 'Pitt'
str2 = 'Brad'
วิธีอื่นๆ ที่ดีกว่า (แนะนำ)
1. Tuple Deconstruction (C# 7.0+) - สุดอ่านง่าย
(str1, str2) = (str2, str1); // One line, ทุก Type, อ่านง่ายที่สุด
2. Temp Variable - เข้าใจง่ายที่สุด
string temp = str1;
str1 = str2;
str2 = temp;
3. StringBuilder (ถ้าต้องการ Performance ใน Loop)
var sb = new System.Text.StringBuilder();
sb.Append(str1);
sb.Append(str2);
str2 = sb.ToString(0, str1.Length);
str1 = sb.ToString(str1.Length, str2.Length);
ตารางเปรียบเทียบ
| วิธี | อ่านง่าย | ประสิทธิภาพ | รองรับ Type | แนะนำ |
|---|---|---|---|---|
Tuple (a,b)=(b,a) |
⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ทุก Type | ✅ Best |
| Temp Variable | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ทุก Type | ✅ Classic |
| Concat + Substring | ⭐⭐ | ⭐⭐ (Alloc 3 Strings) | String เท่านั้น | ❌ Academic Only |
⚠️ ข้อควรระวังของวิธี Concat+Substring
- สร้าง String Object ใหม่ 3 ตัว (Immutable Nature)
- ถ้า String ใหญ่ จะกดดัน Garbage Collector
- Logic ซับซ้อน อ่านยาก Maintain ยาก
- ทำงานได้เฉพาะ String (ไม่ใช่ Generic)
สรุป
ใน Production Code จริง: ใช้ (str1, str2) = (str2, str1); (C# 7+) หรือ Temp Variable
วิธี Concat+Substring: เป็นเพียง Algorithm Exercise / Interview Question เท่านั้น ไม่ควรใช้ใน Production