📅  最后修改于: 2023-12-03 15:14:29.641000             🧑  作者: Mango
在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>
接口。它重写了Equals
和GetHashCode
方法,用于比较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
上使用会慢一些。根据实际情况选择合适的方法。