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

Kiểm tra đối tượng mảng có bằng đối tượng mảng khác trong C#

Giới thiệu

Trong C#, mảng là kiểu tham chiếu (reference type). Phương thức Equals() kế thừa từ Object so sánh tham chiếu (reference equality), không so sánh nội dung. Để so sánh nội dung mảng, cần dùng Enumerable.SequenceEqual() (LINQ) hoặc StructuralComparisons.StructuralEqualityComparer.

Ví dụ 1 - So sánh tham chiếu (mặc định)

using System;

public class Demo
{
    public static void Main()
    {
        String[] strArr1 = new String[3] { "John", "Jacob", "Tim" };
        String[] strArr2 = new String[3] { "Tom", "Brad", "Bradley" };

        Console.WriteLine("Mảng chuỗi đầu tiên...");
        foreach (string val in strArr1)
        {
            Console.WriteLine(val);
        }

        Console.WriteLine("Mảng chuỗi thứ hai...");
        foreach (string val in strArr2)
        {
            Console.WriteLine(val);
        }

        Console.WriteLine("Hai đối tượng mảng có bằng nhau (tham chiếu)? = " + strArr1.Equals(strArr2));
    }
}

Kết quả

Mảng chuỗi đầu tiên...
John
Jacob
Tim
Mảng chuỗi thứ hai...
Tom
Brad
Bradley
Hai đối tượng mảng có bằng nhau (tham chiếu)? = False

Ví dụ 2 - Gán tham chiếu

using System;

public class Demo
{
    public static void Main()
    {
        int[] arr1 = new int[5] { 10, 20, 30, 40, 50 };
        int[] arr2 = new int[5] { 25, 25, 40, 55, 70 };

        Console.WriteLine("Mảng nguyên đầu tiên...");
        foreach (int val in arr1)
        {
            Console.WriteLine(val);
        }

        Console.WriteLine("Mảng nguyên thứ hai...");
        foreach (int val in arr2)
        {
            Console.WriteLine(val);
        }

        // Gán tham chiếu: arr1 và arr2 trỏ đến cùng một đối tượng
        arr1 = arr2;
        Console.WriteLine("Hai đối tượng mảng có bằng nhau (tham chiếu sau gán)? = " + arr1.Equals(arr2));
    }
}

Kết quả

Mảng nguyên đầu tiên...
10
20
30
40
50
Mảng nguyên thứ hai...
25
25
40
55
70
Hai đối tượng mảng có bằng nhau (tham chiếu sau gán)? = True

So sánh nội dung mảng (đúng cách)

using System;
using System.Linq;

public class Demo
{
    public static void Main()
    {
        int[] arr1 = { 1, 2, 3 };
        int[] arr2 = { 1, 2, 3 };
        int[] arr3 = { 1, 2, 4 };

        // Cách 1: LINQ SequenceEqual
        Console.WriteLine("arr1 == arr2 (nội dung): " + arr1.SequenceEqual(arr2)); // True
        Console.WriteLine("arr1 == arr3 (nội dung): " + arr1.SequenceEqual(arr3)); // False

        // Cách 2: StructuralEqualityComparer (cho mảng đa chiều)
        var comparer = System.Collections.IStructuralEquatable.Equals;
        Console.WriteLine("StructuralEquality: " + ((IStructuralEquatable)arr1).Equals(arr2, EqualityComparer.Default));
    }
}

Lưu ý quan trọng

  • Array.Equals() so sánh tham chiếu, không so sánh phần tử.
  • Hai mảng khác instance nhưng cùng nội dung: Equals() trả về false.
  • Sau khi gán arr1 = arr2, cả hai trỏ đến cùng đối tượng → Equals() trả về true.
  • Để so sánh nội dung: dùng SequenceEqual() (LINQ) hoặc IStructuralEquatable.
  • Mảng có kích thước cố định (IsFixedSize = true) và không chỉ đọc (IsReadOnly = false).