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

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

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 → Equals trả về false.
  • Gán arr3 = arr2 làm cho cả hai trỏ đến cùng object → Equals trả 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ứcMô 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 ý

  • BitArray lưu trữ bit gọn gàng (1 bit/phần tử), tiết kiệm bộ nhớ hơn bool[] (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).