C#中比较两个List是否相等的常见方法
目录
- 简介
- 基本类型比较(元素顺序必须一致)
- 忽略顺序比较
- 复杂类型(自定义对象列表)
- 判断是否完全包含对方(不关心顺序)
- 使用 SetEquals(无序、无重复判断)
- 比较两个 null 列表
- 比较两个包含null元素的列表
- 性能优化建议
- 总结
简介
在 C#
里,比较两个 List
是否相等,需要考虑多个方面,例如列表中的元素顺序、元素本身是否相等。下面介绍几种常见的比较方法:
基本类型比较(元素顺序必须一致)
var list1 = new List<int> { 1, 2, 3 }; var list2 = new List<int> { 1, 2, 3 }; bool areEqual = list1.SequenceEqual(list2); // ✅ true
忽略顺序比较
var list1 = new List<int> { 1, 2, 3 }; var list2 = new List<int> { 3, 2, 1 }; bool areEqual = list1.OrderBy(x => x).SequenceEqual(list2.OrderBy(x => x)); // ✅ true
或先分别排完序,再比较:
list3.Sort(); list4.Sort(); Console.WriteLine(list3.SequenceEqual(list4)); // 输出: True
复杂类型(自定义对象列表)
- 实现
Equals
和GetHashCode
方法
public class Person { public string Name { get; set; } public int Age { get; set; } public override bool Equals(object? obj) { if (obj is Person person) { return Name == person.Name && Age == person.Age; } return false; } public override int GetHashCode() { return HashCode.Combine(Name, Age); } }
使用:
Console.WriteLine(person1.SequenceEqual(person2)); // 输出: True
- 自定义比较器:
public class Person { public string Name { get; set; } public int Age { get; set; } }
public class PersonComparer : IEqualityComparer<Person> { public bool Equals(Person? x, Person? y) { return x?.Name == y?.Name && x?.Age == y?.Age; } public int GetHashCode(Person obj) { return HashCode.Combine(obj.Name, obj.Age); // 还有一种写法: // return obj.Name.GetHashCode() ^ obj.Age.GetHashCode(); } }
使用方式:
var list1 = new List<Person> { new Person { Name = "Apythonlice", Age = 25 }, new Person { Name = "Bob", Age = 30 } }; var list2 = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 } }; bool areEqual = list1.Sequehttp://www.devze.comnceEqual(list2, new PersonComparer()); // ✅ true
判断是否完全包含对方(不关心顺序)
bool setEqual = list1.Count == list2.Count && !list1.Except(list2).Any() && !javascriptlist2.Except(list1).Any();
使用 SetEquals(无序、无重复判断)
bool areEqual = new HashSet<int>(list1).SetEquals(list2);
或:
HashSet<int> set1 = new HashSet<int>(list3); HashSet<int> set2 = new HashSet<int>(list4); bool isEqual = set1.SetEquals(set2); Console.WriteLine(isEqual); // 输出: True
比较两个 null 列表
List<int>? list5 = null; List<int>? list6 = null; Console.WriteLine(list5 == list6); // 输出: True
比较两个包含null元素的列表
List<string?> list7 = new List<string?> { "a", null }; List<string?> list8 = new List<string?> { "a", null }; Console.WriteLine(list7.SequenceEqual(list8)); // 输出: True
性能优化建议
小规模数据:使用
SequenceEqual
或HashSet
。大规模数据:
- 先检查列表长度是否相同。
- 使用并行化处理(如 python
ASParallel().SequenceEqual()
)。
总结
场景 | 方法 | 是否考虑顺序 | 是否考虑重复次数 |
---|---|---|---|
顺序敏感且内容相同 | SequenceEqual | 是 | 是 |
顺序不敏感且内容相同 | HashSet.SetEqwww.devze.comuals | 否 | 否 |
顺序不敏感但重复次数相同 | 排序后使用 SequenceEqual | 否 | 是 |
自定义对象比较 | 重写 Equals 或使用 IEqualityComparer | 可配置 | 可配置 |
到此这篇关于C#中比较两个List是否相等的常见方法的文章就介绍到这了,更多相关C#比较两个List相等内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论