比较两个列表对象的等式没有给出正确的结果

时间:2014-07-11 13:59:13

标签: c# collections

我尝试了三种比较两个列表的方法,但没有一种方法可行。

  static void Main(string[] args)
    {
        var list1 = new List<A>()
            {
                {new A(){Id = Guid.Parse("1BA3B3A3-FD4C-E311-B616-A41F729385FA")}},
                {new A(){Id = Guid.Parse("90DF3989-16FC-4E2B-A0C7-A3640156D6F2")}}
            };



        var list2 = new List<A>()
            {
                {new A(){Id = Guid.Parse("1BA3B3A3-FD4C-E311-B616-A41F729385FA")}},
                {new A(){Id = Guid.Parse("90DF3989-16FC-4E2B-A0C7-A3640156D6F2")}}
            };

        var test1 = ListEuality<A>(list1, list2, );
        var areEquivalent = (list1.Count == list2.Count) && !list1.Except(list2).Any();

        var test = list1.OrderBy(t => t.Id).SequenceEqual(list2.OrderBy(t => t.Id));



        Console.ReadLine();

    }
//This Method compares two lists for equality without taking consideration of order.
    public static bool ListEuality<T>(IEnumerable<T> list1, IEnumerable<T> list2)
    {
        var cnt = new Dictionary<T, int>(comparer);
        foreach (T s in list1)
        {
            if (cnt.ContainsKey(s))
            {
                cnt[s]++;
            }
            else
            {
                cnt.Add(s, 1);
            }
        }
        foreach (T s in list2)
        {
            if (cnt.ContainsKey(s))
            {
                cnt[s]--;
            }
            else
            {
                return false;
            }
        }

//如果词典元素变为0意味着为每个项目修改了词典,这意味着项目存在于两个列表中             return cnt.Values.All(c =&gt; c == 0);         }

class A
{
    public Guid Id;
}

2 个答案:

答案 0 :(得分:1)

您可能需要做的就是覆盖Equals对象的A方法,如下所示:

public override bool Equals(Object obj) {
    if (obj == null) return false;
    A objA = obj as A;
    if (objA == null) return false;
    return (this.Id.Equals(objA.Id));
}

此代码:

void Main()
{
    Guid g = Guid.Parse("1BA3B3A3-FD4C-E311-B616-A41F729385FA");
    A a = new A();
    a.Id = g;
    Guid h = Guid.Parse("1BA3B3A3-FD4C-E311-B616-A41F729385FA");
    A b = new A();
    b.Id = h;

    bool eq = a.Equals(b);

    Console.WriteLine(eq);
}

// Define other methods and classes here
public class A {
    public Guid Id;

    public override bool Equals(Object obj) {
        if (obj == null) return false;
        A objA = obj as A;
        if (objA == null) return false;
        return (this.Id.Equals(objA.Id));
    }
}

如果您覆盖Equals,则会返回True。如果删除A-class的Equals方法,则会返回False

答案 1 :(得分:0)

原因是你正在使用不同的A实例。这样做的方法没有覆盖A的比较就是

bool areEquivalent = (list1.Count == list2.Count) && !list1.Select(a => a.ID).Except(list2.Select(a => a.ID).Any();

这意味着您只比较GUID