Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Kiểm tra hai Tuple object bằng nhau trong C#

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