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ặcIStructuralEquatable. - Mảng có kích thước cố định (
IsFixedSize = true) và không chỉ đọc (IsReadOnly = false).