如何查找列表之间的差异?

问题描述 投票:0回答:2

因此,我试图找出2个类型为Person的列表之间的区别。这是人类:

class Person
{
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(int age, string firstName, string lastName)
    {
        this.Age = age;
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

并且在我的代码中,我创建了两个变量List<Person> list1List<Person> list2

我用以下变量填充list1:

list1.Add(new Person(20, "first1", "last1"));
list1.Add(new Person(30, "first2", "last2"));
list1.Add(new Person(40, "first3", "last3"));
list1.Add(new Person(50, "first4", "last4"));

并用以下内容填充list2:

list2.Add(new Person(30, "first2", "last2"));
list2.Add(new Person(50, "first4", "last4"));

我的目标是使用List<Person> list3list1[0]创建另一个列表(list[2]),因为这是list2中未包含的内容。我尝试使用list3 = list1.Except(list2).ToList();,但是它只返回list1的副本,如果我执行list3 = list2.Except(list1).ToList();,它将返回list2的副本。我该如何解决?我使用Except()正确吗?

c# linq generics
2个回答
0
投票

Except使用的相等检查将是ReferenceEquals(它们实际上是相同的对象实例),因为除非另外指定,否则这是比较对象是否相等的默认方式。如果要让Except按Age,FirstName和LastName属性比较Person类,则需要重写Person类上的Equals和GetHashCode方法。

完成此list1.Except(list2).ToList()后就可以使用


0
投票

这里的根本问题是,您需要问自己,什么使这些对象相等?仅仅因为您给它们分配了相等的属性值,并不使它们相等。例如,尽管list1 1和list2 [0]看起来相同,但它们是Person对象的完全不同的实例。因此,您需要一种方法来判断一个Person对象何时与另一个对象“相等”。Generate Equals and GetHashCode method overrides in Visual Studio

这也可能有帮助,Overriding Equals in C#

希望这会有所帮助,如果可以,请将此标记为答案。祝好运!这是有效的代码:

class Program
{
    static void Main(string[] args)
    {
        var list1 = new List<Person>();
        list1.Add(new Person(20, "first1", "last1"));
        list1.Add(new Person(30, "first2", "last2"));
        list1.Add(new Person(40, "first3", "last3"));
        list1.Add(new Person(50, "first4", "last4"));

        var list2 = new List<Person>();
        list2.Add(new Person(30, "first2", "last2"));
        list2.Add(new Person(50, "first4", "last4"));

        var list3 = list1.Except(list2).ToList();
    }
}

class Person : IEquatable<Person>
{
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public Person(int age, string firstName, string lastName)
    {
        this.Age = age;
        this.FirstName = firstName;
        this.LastName = lastName;
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Person);
    }

    public bool Equals(Person otherPerson)
    {
        return otherPerson != null && this.Age == otherPerson.Age && this.FirstName == otherPerson.FirstName && this.LastName == otherPerson.LastName;
    }

    public override int GetHashCode()
    {
        //var hashCode = 57;
        return this.Age.GetHashCode() + this.FirstName.GetHashCode() + this.LastName.GetHashCode();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.