基本上,我有一個包含多個字段的結構。我將創建兩個包含此結構實例的列表,並且我需要能夠檢查兩個列表是否相同(即相同數量的結構並且所有字段的值相同)。比較具有不同引用的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