基本上,我有一个包含许多字段的结构。我将创建包含此结构实例的两个列表,并且我需要能够检查两个列表是否相同(即,相同数量的结构并且所有字段具有相同的值)。 / p>
我正在研究SequenceEqual运算符,但是它依赖于列表中具有相同引用的项目 - 它们不会,它们都来自不同的来源。
我可以通过字段对列表进行排序,遍历列表中的每个项目,然后循环遍历列表中的每个字段/属性,看看它是否与其他列表匹配 - 但它似乎有点过于复杂。有更简单的方法吗?
答案 0 :(得分:4)
SequenceEqual
运算符使用比较器进行比较,而不是通过引用序列进行比较。
From MSDN:“通过使用类型的默认相等比较器来比较元素,确定两个序列是否相等。”
使用SequenceEqual
并实施IEqualityComparer
,您应该没问题。
var areSame = list1.SequenceEqual(list2, new MyStructComparer());
class MyStructComparer : IEqualityComparer<MyStruct> {
public bool Equals(MyStruct x, MyStruct y) {
if (Object.ReferenceEquals(x, y))
return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.A == y.A && x.B == y.B;
}
public int GetHashCode(MyStruct myStruct)
{
if (Object.ReferenceEquals(myStruct, null))
return 0;
int hashMyStructA = myStruct.A == null ? 0 : myStruct.A.GetHashCode();
int hashMyStructB = myStruct.B == null ? 0 : myStruct.B.GetHashCode();
return hashMyStructA ^ hashMyStructB;
}
}
答案 1 :(得分:1)
您可以覆盖Equals()
并比较其中的所有属性,如果它们全部相等则返回true。
public struct MyStruct
{
public int A;
public int B;
public override bool Equals(object obj)
{
MyStruct other = (MyStruct) obj;
return A == other.A && B == other.B;
}
}
为了列表相等,我会写一个扩展方法:
public static class MyStructExtension
{
public static bool ListsEqual(this IList<MyStruct> a, IList<MyStruct> b)
{
if(a==b)
return true;
if (a == null || b == null)
return false;
if (a.Count != b.Count)
return false;
for (int i = 0; i < a.Count; i++)
{
if (!a[i].Equals(b[i]))
return false;
}
return true;
}
}