dotnet 使用完全对象引用相等判断

默认在列表以及字典哈希这些都会先看对象是否有自己实现的等于判断,如果有就调用对象的。因此对象可以做到两个不同的对象返回相等。而如果需要判断对象引用相等,也就是只有相同的对象才返回相等,此时需要用到 ReferenceEquals 方法。这个判断方法是最快的判断相等的方法,只有在传入的两个参数是相同的对象的时候才会返回 true 的值

那么如何将这个引用相等放在列表或字典哈希等的判断里面?可以看到字典等的构造函数都有重载方法,要求传入 IEqualityComparer 接口,于是可以做如下实现

    class ReferenceEqualsComparer<T> : ReferenceEqualsComparer, IEqualityComparer<T>
    {
        /// <inheritdoc />
        public bool Equals(T x, T y) => ((IEqualityComparer) this).Equals(x, y);

        /// <inheritdoc />
        public int GetHashCode(T obj) => obj.GetHashCode();
    }

    class ReferenceEqualsComparer : IEqualityComparer
    {
        /// <inheritdoc />
        bool IEqualityComparer.Equals(object x, object y) => ReferenceEquals(x, y);

        /// <inheritdoc />
        public int GetHashCode(object obj) => obj?.GetHashCode()??0;
    }

对于字典可以这样使用

        private Dictionary<Lindexi, string> LindexiShiDoubi { get; } =
            // 这里需要使用完全相等的判断,对象完全相等
            new Dictionary<Lindexi, string>(new ReferenceEqualsComparer<Lindexi>());

对于哈希可以这样使用

private HashSet<Lindexi> Lindexi { get; } = new HashSet<Lindexi>(new ReferenceEqualsComparer<Lindexi>());

这样所有进行判断的 Contains 或 ContainsKey 都使用对象引用判断,只有传入和内存里面存放相同的对象才能判断存在

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值