比较2个不同引用的列表(C#)

时间:2011-04-15 15:17:39

标签: c# linq list

基本上,我有一个包含许多字段的结构。我将创建包含此结构实例的两个列表,并且我需要能够检查两个列表是否相同(即,相同数量的结构并且所有字段具有相同的值)。 / p>

我正在研究SequenceEqual运算符,但是它依赖于列表中具有相同引用的项目 - 它们不会,它们都来自不同的来源。

我可以通过字段对列表进行排序,遍历列表中的每个项目,然后循环遍历列表中的每个字段/属性,看看它是否与其他列表匹配 - 但它似乎有点过于复杂。有更简单的方法吗?

2 个答案:

答案 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;
        }
    }