首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我怎么才能在不检查空值的情况下编写我的IEqualityComparer呢?

在不检查空值的情况下编写 IEqualityComparer 接口的实现,可以通过重写 EqualsGetHashCode 方法来实现。这样可以确保在比较对象时不会因为空值而引发异常。以下是一个示例代码,展示了如何实现这一点:

代码语言:txt
复制
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;
            }
        }
    }
}

解释

  1. Equals 方法
    • 首先检查两个对象是否都为 null,如果是,则认为它们相等。
    • 如果其中一个对象为 null,则认为它们不相等。
    • 最后,比较对象的属性(例如 IdName)。
  • GetHashCode 方法
    • 如果对象为 null,则返回一个默认的哈希码(例如 0)。
    • 使用对象的属性计算哈希码,确保相同的对象具有相同的哈希码。

应用场景

这种实现方式适用于需要在集合中进行对象比较的场景,特别是在不需要检查空值的情况下。例如,在使用 ArrayListList<T> 或其他集合类时,可以使用自定义的 IEqualityComparer 来进行对象比较。

参考链接

通过这种方式,你可以确保在比较对象时不会因为空值而引发异常,同时保持代码的简洁和可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

8分7秒

【自学编程】给大二学弟的编程学习建议

领券