IEquatable文档令人困惑

问题描述 投票:0回答:1

嗨,我正试图在我的程序中添加IEquatable,我不知道我是否需要添加一个唯一的ID和一个哈希码?他们在IEquatable中使用shd号作为唯一的id,但他们在构造函数中给出了它的值,我在这个网站上问构造函数是否需要像文档中那样,我得到的答复是不需要。所以现在我很困惑,谁能给我一个更简单的IEquatable的例子,然后在文档中做? 这里是文档的链接 https:/docs.microsoft.comen-usdotnetapisystem.iequatable-1?view=netcore-3.1。 我只是想让一个自定义对象列表的包含工作。

我的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataConverter.Objects
{
    public class Category : IEquatable<Category>
    {
       public string _Name { get; set; }
       public string _Id { get; set;}

       private string _HomeCategory { get; set; }  
       public string _prestaId { get; set; }

       public bool _inUse { get; set; }






        public Category(string Name, string Id, string HomeCategory, bool inUse)
        {
            _Name = Name;
            _Id = Id;
            _HomeCategory = HomeCategory;
            _inUse = inUse;

        }

        public bool Equals(Category other)
        {
            if (other == null)
                return false;

            if()
        }
    }
}
c# list contains iequatable
1个回答
1
投票

IEquatable<T> 只是一个接口,告诉你当前类型具有值平等语义,而不是引用平等。是什么让两个不同的objets平等或不平等,背后的逻辑完全取决于你应用的业务逻辑,而不是你如何正确或错误地实现接口。

是什么让两个类别在你的领域中是相同的?相同的 Id? 那你的等价法就是。

public bool Equals(Category other)
{
    if (other == null)
        return false;

    return _Id == other._Id;
}

相同的ID和名字?

public bool Equals(Category other)
{
    if (other == null)
        return false;

    return _Id == other._Id &&
           _Name == other._Name;
}

以此类推。由你来决定什么使两个类别彼此相等。

现在,关于哈希码。一个哈希码必须遵守的基本规则是: 两个相同的类别必须有相同的哈希码。 请注意,这并不意味着具有相同哈希码的两个类别是平等的,哈希码可以碰撞,完全没有问题。另外,如果对象发生变化,哈希码也不应该发生变化,所以理想的情况下,哈希码应该建立在不能改变的数据上。

好了,那么在你的特定场景下,你会如何实现你的哈希码呢?

案例一:你的哈希码是如何实现的?

public override int GetHashCode() => _Id.GetHashCode();

情况二:

public override int GetHashCode() => _Id.GetHashCode() ^
                                     _Name.GetHashCode();

两个哈希值都会和它们的 Equals 的对应物。唯一的问题是,它们建立在潜在的可变数据上(Id和Name都有设置器),所以如果这些数据发生变化,你的hashchcode也会发生变化,这通常是一个坏主意。

根据你的情况,你可能需要以不同的方式来处理这个问题。在执行任何哈希敏感操作时,你的数据可能会发生突变吗?例如Linq就广泛使用了哈希......。

© www.soinside.com 2019 - 2024. All rights reserved.