Trong C#, phương thức Equals() của Tuple so sánh giá trị của từng phần tử tương ứng. Hai Tuple được coi là bằng nhau khi có cùng số phần tử, cùng kiểu dữ liệu tại mỗi vị trí và giá trị bằng nhau (sử dụng Equals của từng phần tử).
Ví dụ 1: Hai Tuple giống hệt nhau
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 bằng Tuple2? = " + tuple1.Equals(tuple2));
}
}
Kết quả
Tuple1 bằng Tuple2? = True
Ví dụ 2: Tuple lồng nhau (nested) - khác nhau
using System;
public class Demo
{
public static void Main(string[] args)
{
// Tuple 8 phần tử: 7 phần tử + Rest (Tuple lồng)
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 bằng Tuple2? = " + tuple1.Equals(tuple2));
}
}
Kết quả
Tuple1 bằng Tuple2? = False
Cơ chế so sánh Equals()
// Logic nội bộ của Tuple.Equals()
public override bool Equals(object obj)
{
if (obj is Tuple<T1, T2, ...> other)
{
return Item1.Equals(other.Item1) &&
Item2.Equals(other.Item2) &&
...
Item7.Equals(other.Item7) &&
Rest.Equals(other.Rest); // So sánh đệ quy cho nested tuple
}
return false;
}
Các trường hợp so sánh
| Tuple 1 | Tuple 2 | Kết quả | Lý do |
|---|---|---|---|
| (1, 2, 3) | (1, 2, 3) | True | Cùng giá trị tất cả phần tử |
| (1, 2, 3) | (1, 2, 4) | False | Phần tử thứ 3 khác |
| (1, 2, 3) | (1, 2) | False | Khác số phần tử (kiểu Tuple khác) |
| (1, "2", 3) | (1, 2, 3) | False | Khác kiểu dữ liệu phần tử 2 |
| (1, 2, (3, 4)) | (1, 2, (3, 4)) | True | Nested tuple cũng bằng nhau |
| (1, 2, (3, 4)) | (1, 2, (3, 5)) | False | Nested tuple khác nhau |
So sánh với == operator
⚠️ Lưu ý: Tuple class KHÔNG overload toán tử
==. Việc dùng tuple1 == tuple2 sẽ so sánh tham chiếu (reference equality), không phải giá trị.
var t1 = Tuple.Create(1, 2); var t2 = Tuple.Create(1, 2); Console.WriteLine(t1.Equals(t2)); // True - so sánh giá trị Console.WriteLine(t1 == t2); // False - so sánh tham chiếu (default) Console.WriteLine(ReferenceEquals(t1, t2)); // False
ValueTuple - So sánh tự nhiên (C# 7.0+)
ValueTuple hỗ trợ toán tử == và != so sánh giá trị:
// ValueTuple syntax var vt1 = (1, 2, 3); var vt2 = (1, 2, 3); var vt3 = (1, 2, 4); Console.WriteLine(vt1 == vt2); // True - so sánh giá trị! Console.WriteLine(vt1 == vt3); // False // Cũng có Equals() Console.WriteLine(vt1.Equals(vt2)); // True
Lưu ý
- Tuple class (System.Tuple) là reference type, immutable
Equals()so sánh giá trị đệ quy qua tất cả phần tửGetHashCode()kết hợp hash của tất cả phần tử- Khuyến nghị dùng ValueTuple cho code mới (C# 7.0+)
- ValueTuple là struct (value type), hiệu năng tốt hơn