因此,我试图找出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> list1
和List<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> list3
和list1[0]
创建另一个列表(list[2]
),因为这是list2
中未包含的内容。我尝试使用list3 = list1.Except(list2).ToList();
,但是它只返回list1
的副本,如果我执行list3 = list2.Except(list1).ToList();
,它将返回list2
的副本。我该如何解决?我使用Except()
正确吗?
Except
使用的相等检查将是ReferenceEquals(它们实际上是相同的对象实例),因为除非另外指定,否则这是比较对象是否相等的默认方式。如果要让Except按Age,FirstName和LastName属性比较Person类,则需要重写Person类上的Equals和GetHashCode方法。
完成此list1.Except(list2).ToList()
后就可以使用
这里的根本问题是,您需要问自己,什么使这些对象相等?仅仅因为您给它们分配了相等的属性值,并不使它们相等。例如,尽管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();
}
}