在不检查空值的情况下编写 IEqualityComparer
接口的实现,可以通过重写 Equals
和 GetHashCode
方法来实现。这样可以确保在比较对象时不会因为空值而引发异常。以下是一个示例代码,展示了如何实现这一点:
using System;
using System.Collections;
public class MyObject
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MyObjectComparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject x, MyObject y)
{
// 如果两个对象都为null,则认为它们相等
if (x == null && y == null) return true;
// 如果其中一个对象为null,则认为它们不相等
if (x == null || y == null) return false;
// 比较对象的属性
return x.Id == y.Id && string.Equals(x.Name, y.Name, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(MyObject obj)
{
// 如果对象为null,则返回一个默认的哈希码
if (obj == null) return 0;
// 使用对象的属性计算哈希码
int hash = 17;
hash = hash * 23 + obj.Id.GetHashCode();
hash = hash * 23 + (obj.Name != null ? obj.Name.GetHashCode() : 0);
return hash;
}
}
class Program
{
static void Main()
{
var list = new ArrayList();
list.Add(new MyObject { Id = 1, Name = "Alice" });
list.Add(new MyObject { Id = 2, Name = "Bob" });
list.Add(null);
var comparer = new MyObjectComparer();
var itemToFind = new MyObject { Id = 1, Name = "Alice" };
foreach (var item in list)
{
if (comparer.Equals(item, itemToFind))
{
Console.WriteLine("Found!");
break;
}
}
}
}
null
,如果是,则认为它们相等。null
,则认为它们不相等。Id
和 Name
)。null
,则返回一个默认的哈希码(例如 0
)。这种实现方式适用于需要在集合中进行对象比较的场景,特别是在不需要检查空值的情况下。例如,在使用 ArrayList
、List<T>
或其他集合类时,可以使用自定义的 IEqualityComparer
来进行对象比较。
通过这种方式,你可以确保在比较对象时不会因为空值而引发异常,同时保持代码的简洁和可读性。
领取专属 10元无门槛券
手把手带您无忧上云