IEqualityComparer用于自定义对象比较逻辑,通过实现Equals和GetHashCode方法,可在Dictionary、HashSet、LINQ等场景中按业务规则判断相等性,如Person类按Name和Age判断,避免默认引用或值比较的局限。

IEqualityComparer
该接口包含两个方法:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
现在我们想让两个 Person 对象在 Name 和 Age 相同时被视为相等。可以创建一个实现 IEqualityComparer
public class PersonComparer : 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;
}
<pre class="brush:php;toolbar:false;">public int GetHashCode(Person obj)
{
if (obj == null) return 0;
return HashCode.Combine(obj.Name, obj.Age);
}}
1. 用在 Dictionary 中作为键:
var people = new Dictionary<Person, string>(new PersonComparer());
people[new Person { Name = "Alice", Age = 30 }] = "Engineer";
2. 去除 List 中的重复项:
var list = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Alice", Age = 30 }
};
<p>var distinct = list.Distinct(new PersonComparer()).ToList(); // 只保留一个
3. 用于 HashSet:
var set = new HashSet<Person>(new PersonComparer());
set.Add(new Person { Name = "Bob", Age = 25 });
set.Add(new Person { Name = "Bob", Age = 25 }); // 不会重复添加
public class PersonComparer : IEqualityComparer<Person>
{
public static readonly PersonComparer Instance = new PersonComparer();
<pre class="brush:php;toolbar:false;">private PersonComparer() { }
public bool Equals(Person x, Person y) { ... }
public int GetHashCode(Person obj) { ... }}
使用时:
var distinct = list.Distinct(PersonComparer.Instance).ToList();
基本上就这些。实现 IEqualityComparer
以上就是C#的IEqualityComparer是什么?如何为自定义类型提供比较逻辑?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号