csharppublic class Person{ public string Name { get; set; } public int Age { get; set; }}public class PersonEqualityComparer : IEqualityComparer{ public bool Equals(Person x, Person y) { if (x == null || y == null) return false; return x.Name == y.Name && x.Age == y.Age; } public int GetHashCode(Person obj) { return obj.Name.GetHashCode() ^ obj.Age.GetHashCode(); }}
在上面的代码中,我们定义了一个 Person 类,并实现了 IEqualityComparer 接口。在 Equals 方法中,我们比较了两个 Person 对象的 Name 和 Age 属性是否相等。在 GetHashCode 方法中,我们通过对 Name 和 Age 的哈希码进行异或运算来生成对象的哈希码。在 IEnumerable 上使用自定义比较器一旦我们实现了自定义的 IEqualityComparer 接口,就可以在 IEnumerable 上使用它来进行比较。通过传递自定义的比较器给 LINQ 方法,我们可以根据自己的比较逻辑来区分集合中的元素。下面是一个示例代码,展示了如何在 IEnumerable 上使用自定义的比较器:
csharpstatic void Main(string[] args){ List people = new List() { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Alice", Age = 25 } }; var distinctPeople = people.Distinct(new PersonEqualityComparer()); foreach (var person in distinctPeople) { Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); }}
在上面的代码中,我们创建了一个包含三个 Person 对象的 List。然后,我们使用 Distinct 方法来获取独特的 Person 对象,传递了我们刚刚实现的自定义比较器。最后,我们使用 foreach 循环来遍历并输出结果。使用自定义 IEqualityComparer 接口可以在 C# 中对 IEnumerable 进行比较和区分。通过实现自己的比较器,我们可以根据自己的需求来定义两个对象是否相等。这为我们提供了更大的灵活性和控制力,以满足不同的业务需求。