如何判断两个包含自定义Person对象的List是否相等?
判断两个包含自定义Person对象的List是否相等
你的代码里直接用list1 == list2会得到false,因为List<T>默认的==运算符是比较引用地址——list1和list2是两个独立创建的List实例,内存地址不同,所以直接判断肯定不相等。
要判断两个List的内容是否相等,需要同时满足两个条件:
- 两个List的元素数量完全一致
- 对应位置的每个Person对象的属性值都完全匹配
下面提供两种可行的实现方式:
方法一:重写Person类的Equals和GetHashCode方法
通过重写自定义类的相等判断逻辑,让SequenceEqual方法能正确比较对象属性:
public class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { this.Name = name; this.Age = age; } // 自定义对象相等判断逻辑 public override bool Equals(object obj) { if (obj is not Person otherPerson) return false; return Name == otherPerson.Name && Age == otherPerson.Age; } // 必须和Equals逻辑保持一致,用于哈希相关操作 public override int GetHashCode() { return HashCode.Combine(Name, Age); } }
之后用SequenceEqual方法比较两个List:
bool listsEqual = list1.SequenceEqual(list2); Debug.WriteLine("Lists are equal: " + listsEqual); // 输出true
SequenceEqual会逐个比对两个序列的元素,每个元素的比较会调用我们重写的Equals方法,从而判断属性是否一致。
方法二:使用自定义比较器(不修改Person类)
如果不想修改Person类,可以实现IEqualityComparer<Person>接口,作为比较规则传入SequenceEqual的重载方法:
public class PersonEqualityComparer : IEqualityComparer<Person> { public bool Equals(Person x, Person y) { if (x == null && y == null) return true; if (x == null || y == null) return false; return x.Name == y.Name && x.Age == y.Age; } public int GetHashCode(Person obj) { return obj == null ? 0 : HashCode.Combine(obj.Name, obj.Age); } }
调用方式:
bool listsEqual = list1.SequenceEqual(list2, new PersonEqualityComparer()); Debug.WriteLine("Lists are equal: " + listsEqual); // 输出true
补充:不考虑元素顺序的情况
如果不需要严格匹配元素顺序,只需要判断两个List包含的属性相同的Person对象完全一致(包含重复元素的数量也要匹配),可以用以下方式:
bool listsEqualUnordered = list1.Count == list2.Count && list1.All(p => list2.Count(p2 => p.Equals(p)) == list1.Count(p2 => p2.Equals(p)));
内容的提问来源于stack exchange,提问作者DmO
相关产品推荐
相关产品推荐

