基本上,我有一个包含多个字段的结构。我将创建两个包含此结构实例的列表,并且我需要能够检查两个列表是否相同(即相同数量的结构并且所有字段的值相同)。比较具有不同引用的2个列表(C#)
我正在查看SequenceEqual运算符,但依赖于列表中具有相同引用的项目 - 它们不会,它们都来自不同的来源。
我可以通过字段排序列表,循环列表中的每个项目,然后遍历列表中的每个字段/属性,并查看它是否与另一个列表中的匹配 - 但它似乎有点过于复杂。有更容易的方法吗?
基本上,我有一个包含多个字段的结构。我将创建两个包含此结构实例的列表,并且我需要能够检查两个列表是否相同(即相同数量的结构并且所有字段的值相同)。比较具有不同引用的2个列表(C#)
我正在查看SequenceEqual运算符,但依赖于列表中具有相同引用的项目 - 它们不会,它们都来自不同的来源。
我可以通过字段排序列表,循环列表中的每个项目,然后遍历列表中的每个字段/属性,并查看它是否与另一个列表中的匹配 - 但它似乎有点过于复杂。有更容易的方法吗?
SequenceEqual
运算符使用比较器而不是通过引用序列进行比较。
从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;
}
}
您可以覆盖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;
}
}
这意味着他还需要提供自己的`equals()方法的结构`方法。他可以先用usign'first.All(i => second.Any(x => x.Id.equals(i.Id)));` – 2011-04-15 15:22:23