比较两个列表对象是否相等,没有给出正确的结果

本文关键字:结果 两个 是否 对象 列表 比较 | 更新日期: 2023-09-27 18:12:41

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

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

//如果dictionary元素变为0,则表示每个元素的字典都被修改,这意味着两个列表中都存在项cnt.Values返回。(c => c == 0);}

class A
{
    public Guid Id;
}

比较两个列表对象是否相等,没有给出正确的结果

可能你需要做的就是为你的A对象重写Equals方法,像这样:

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类的Equals方法,它将返回False

原因是您正在使用A的不同实例。一种不覆盖A的比较的方法是

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

意味着你只比较guid