简介
在 里,比较两个 是否相等,需要考虑多个方面,例如列表中的元素顺序、元素本身是否相等。下面介绍几种常见的比较方法:
基本类型比较(元素顺序必须一致)
- 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
复制代码 复杂类型(自定义对象列表)
- 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 = "Alice", 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.SequenceEqual(list2, new PersonComparer()); // ✅ true
复制代码 判断是否完全包含对方(不关心顺序)
- bool setEqual = list1.Count == list2.Count &&
- !list1.Except(list2).Any() &&
- !list2.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
复制代码 性能优化建议
- 小规模数据:使用或。
- 大规模数据:
- 先检查列表长度是否相同。
- 使用并行化处理(如
- AsParallel().SequenceEqual()
复制代码 )。
总结
场景方法是否考虑顺序是否考虑重复次数顺序敏感且内容相同 是是顺序不敏感且内容相同 否否顺序不敏感但重复次数相同排序后使用 否是自定义对象比较重写 或使用 可配置可配置到此这篇关于C#中比较两个List是否相等的常见方法的文章就介绍到这了,更多相关C#比较两个List相等内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |