เมธอด Equals(object) ของ Tuple เปรียบเทียบค่าขององค์ประกอบทุกตำแหน่ง คืน true ก็ต่อเมื่อ ทุกองค์ประกอบเท่ากันและลำดับเหมือนกัน
ตัวอย่างที่ 1: Tuple 7 องค์ประกอบ เท่ากันทุกตัว
using System;
public class Demo
{
public static void Main(string[] args)
{
var tuple1 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500);
var tuple2 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500);
Console.WriteLine("Tuple1 เท่ากับ Tuple2? = " + tuple1.Equals(tuple2));
}
}
ผลลัพธ์
Tuple1 เท่ากับ Tuple2? = True
ตัวอย่างที่ 2: Tuple 8 องค์ประกอบ (มี Nested Tuple) ไม่เท่ากัน
using System;
public class Demo
{
public static void Main(string[] args)
{
// Tuple 8 องค์ประกอบ: 7 องค์ประกอบแรก + Tuple.Create(50, 100) เป็น Rest
var tuple1 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500, Tuple.Create(50, 100));
var tuple2 = Tuple.Create(150, 400, 500, 700, 100, 1200, 1500, Tuple.Create(100, 200));
Console.WriteLine("Tuple1 เท่ากับ Tuple2? = " + tuple1.Equals(tuple2));
}
}
ผลลัพธ์
Tuple1 เท่ากับ Tuple2? = False
กฎการเทียบ Tuple
| เงื่อนไข | ผลลัพธ์ Equals |
| จำนวนองค์ประกอบต่างกัน | False |
| ประเภทองค์ประกอบต่างกัน (เช่น int vs string) | False |
| ค่าองค์ประกอบใดตัวหนึ่งต่างกัน | False |
| Nested Tuple ต่างกัน | False (เปรียบเทียบ Recursive) |
| ทุกอย่างเหมือนกันทุกประการ | True |
รายละเอียดเพิ่มเติม
Tuple เป็น Reference Type (Class) แต่ Equals เปรียบเทียบ Value Equality (ค่า) ไม่ใช่ Reference
GetHashCode() คำนวณจากค่าทุกองค์ประกอบ เหมาะสำหรับใช้เป็น Key ใน Dictionary
- Tuple เป็น Immutable (ไม่สามารถเปลี่ยนค่าได้หลังสร้าง)
แนะนำ: ใช้ ValueTuple (C# 7.0+)
// ValueTuple - Struct, Mutable, รองรับชื่อองค์ประกอบ
var t1 = (150, 400, 500, 700, 100, 1200, 1500);
var t2 = (150, 400, 500, 700, 100, 1200, 1500);
Console.WriteLine(t1 == t2); // True (ValueTuple overload == operator)
// หรือมีชื่อ
var p1 = (X: 10, Y: 20);
var p2 = (X: 10, Y: 20);
Console.WriteLine(p1 == p2); // True
Console.WriteLine(p1.Equals(p2)); // True
เปรียบเทียบ Tuple vs ValueTuple
| คุณสมบัติ | System.Tuple (Class) | System.ValueTuple (Struct) |
| Equals Behavior | Value Equality | Value Equality |
| == Operator | Reference Equality (Default) | Value Equality (Overloaded) |
| Mutability | Immutable | Mutable |
| Named Elements | ไม่รองรับ | รองรับ |
| Performance | Heap Allocation | Stack Allocation (เร็วกว่า) |