Giới thiệu
Để kiểm tra hai BitArray có bằng nhau hay không, sử dụng phương thức Equals(). Tuy nhiên, BitArray.Equals() kế thừa từ Object.Equals() so sánh tham chiếu (reference equality), không so sánh nội dung bit. Để so sánh nội dung, cần duyệt thủ công hoặc dùng LINQ.
Ví dụ 1: Tham chiếu cùng đối tượng (True)
using System;
using System.Collections;
public class Demo {
public static void Main() {
BitArray arr1 = new BitArray(2);
BitArray arr2 = new BitArray(2);
arr1[0] = false;
arr1[1] = true;
Console.WriteLine("Phần tử BitArray1...");
foreach (bool bit in arr1) {
Console.WriteLine(bit);
}
arr2[0] = false;
arr2[1] = true;
Console.WriteLine("Phần tử BitArray2...");
foreach (bool bit in arr2) {
Console.WriteLine(bit);
}
BitArray arr3 = new BitArray(2);
arr3 = arr2; // Gán tham chiếu
Console.WriteLine("BitArray2 bằng BitArray3 (tham chiếu)? = " + arr2.Equals(arr3));
}
}
Đầu ra ví dụ 1
Phần tử BitArray1... False True Phần tử BitArray2... False True BitArray2 bằng BitArray3 (tham chiếu)? = True
Ví dụ 2: Nội dung giống nhau nhưng khác đối tượng (False)
using System;
using System.Collections;
public class Demo {
public static void Main() {
BitArray arr1 = new BitArray(2);
BitArray arr2 = new BitArray(2);
arr1[0] = false;
arr1[1] = true;
Console.WriteLine("Phần tử BitArray1...");
foreach (bool bit in arr1) {
Console.WriteLine(bit);
}
arr2[0] = false;
arr2[1] = true;
Console.WriteLine("Phần tử BitArray2...");
foreach (bool bit in arr2) {
Console.WriteLine(bit);
}
Console.WriteLine("BitArray1 bằng BitArray2 (Equals)? = " + arr1.Equals(arr2));
}
}
Đầu ra ví dụ 2
Phần tử BitArray1... False True Phần tử BitArray2... False True BitArray1 bằng BitArray2 (Equals)? = False
Giải thích quan trọng
BitArray.Equals(object)không được override → so sánh reference (tham chiếu).- Hai BitArray khác instance nhưng nội dung bit y hệt →
Equalstrả vềfalse. - Gán
arr3 = arr2làm cho cả hai trỏ đến cùng object →Equalstrả vềtrue.
Cách so sánh nội dung BitArray đúng cách
using System;
using System.Collections;
using System.Linq;
public static bool ContentEquals(BitArray a, BitArray b) {
if (a.Count != b.Count) return false;
for (int i = 0; i < a.Count; i++) {
if (a[i] != b[i]) return false;
}
return true;
}
// Hoặc dùng LINQ (cần Cast)
public static bool ContentEqualsLinq(BitArray a, BitArray b) {
return a.Count == b.Count &&
a.Cast().SequenceEqual(b.Cast());
}
// Extension method tiện lợi
public static class BitArrayExtensions {
public static bool ContentEquals(this BitArray a, BitArray b) {
if (a.Count != b.Count) return false;
for (int i = 0; i < a.Count; i++) {
if (a[i] != b[i]) return false;
}
return true;
}
}
Ví dụ sử dụng extension method
BitArray a = new BitArray(new[] { false, true, false });
BitArray b = new BitArray(new[] { false, true, false });
BitArray c = new BitArray(new[] { true, false, true });
Console.WriteLine(a.ContentEquals(b)); // True
Console.WriteLine(a.ContentEquals(c)); // False
Console.WriteLine(a.Equals(b)); // False (reference!)
Các phương thức BitArray hữu ích khác
| Phương thức | Mô tả |
|---|---|
| And(BitArray) | Phép AND bitwise, sửa đổi this |
| Or(BitArray) | Phép OR bitwise, sửa đổi this |
| Xor(BitArray) | Phép XOR bitwise, sửa đổi this |
| Not() | Phép NOT bitwise, trả về BitArray mới |
| Get(int index) | Lấy bit tại index |
| Set(int index, bool value) | Đặt bit tại index |
| CopyTo(Array, int) | Sao chép bit sang mảng |
Lưu ý
BitArraylưu trữ bit gọn gàng (1 bit/phần tử), tiết kiệm bộ nhớ hơnbool[](1 byte/phần tử).- Không implement
IEquatable<BitArray>. - Trong .NET 6+, có thể dùng
BitArray.Equals(BitArray)nếu overload được thêm (kiểm tra docs phiên bản).