📜  C#|检查两个ArrayList对象是否相等(1)

📅  最后修改于: 2023-12-03 15:14:29.641000             🧑  作者: Mango

C# | 检查两个ArrayList对象是否相等

在C#中,ArrayList是一个动态数组,可以包含任意类型的元素。有时候,我们需要检查两个ArrayList对象是否相等。这篇文章将介绍如何实现这个功能。

方法一:使用序列化
using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public static bool IsArrayListEqual(ArrayList list1, ArrayList list2)
{
    if (list1 == null || list2 == null)
    {
        return list1 == list2;
    }

    BinaryFormatter formatter = new BinaryFormatter();
    using (MemoryStream stream1 = new MemoryStream())
    {
        formatter.Serialize(stream1, list1);

        using (MemoryStream stream2 = new MemoryStream())
        {
            formatter.Serialize(stream2, list2);

            if (stream1.Length != stream2.Length)
            {
                return false;
            }

            byte[] buffer1 = stream1.ToArray();
            byte[] buffer2 = stream2.ToArray();

            for (int i = 0; i < buffer1.Length; i++)
            {
                if (buffer1[i] != buffer2[i])
                {
                    return false;
                }
            }

            return true;
        }
    }
}

这个方法使用序列化将两个ArrayList对象转换成二进制数据,再比较它们的二进制数据是否相等。这种方法可以检查ArrayList中包含的元素是否相等,但不会检查它们在ArrayList中的顺序是否相同。

方法二:自定义比较器
public class ArrayListComparer : IEqualityComparer<ArrayList>
{
    public bool Equals(ArrayList list1, ArrayList list2)
    {
        if (list1 == null || list2 == null)
        {
            return list1 == list2;
        }

        if (list1.Count != list2.Count)
        {
            return false;
        }

        for (int i = 0; i < list1.Count; i++)
        {
            if (!list1[i].Equals(list2[i]))
            {
                return false;
            }
        }

        return true;
    }

    public int GetHashCode(ArrayList list)
    {
        if (list == null)
        {
            return 0;
        }

        int hashCode = 0;
        foreach (object obj in list)
        {
            hashCode ^= obj.GetHashCode();
        }

        return hashCode;
    }
}

这个方法自定义了一个ArrayListComparer类,实现了IEqualityComparer<ArrayList>接口。它重写了EqualsGetHashCode方法,用于比较ArrayList对象是否相等。

示例

下面是使用这两个方法检查两个ArrayList对象是否相等的示例:

ArrayList list1 = new ArrayList { 1, "hello", 3.14 };
ArrayList list2 = new ArrayList { 1, "hello", 3.14 };

// 使用序列化方法检查两个ArrayList对象是否相等
bool isEqualBySerialize = IsArrayListEqual(list1, list2);

// 使用自定义比较器方法检查两个ArrayList对象是否相等
ArrayListComparer comparer = new ArrayListComparer();
bool isEqualByComparer = comparer.Equals(list1, list2);

输出:

isEqualBySerialize: True
isEqualByComparer: True
结论

以上是检查两个ArrayList对象是否相等的两种方法。使用序列化方法可以快速检查两个ArrayList对象是否相等,但它无法检查对象在ArrayList中的顺序是否相同。使用自定义比较器方法可以检查对象在ArrayList中的顺序是否相同,但它需要遍历整个ArrayList,所以在大型ArrayList上使用会慢一些。根据实际情况选择合适的方法。