IEquatable文档令人困惑

时间:2020-05-04 09:54:32

标签: c# list contains iequatable

嗨,我正在尝试将IEquatable添加到我的程序中,但是我根本不知道是否需要基本添加唯一的ID和哈希码?他们在IEquatable中使用shd编号作为唯一ID,但是在构造函数中将其赋值,我在这个网站上问是否需要构造函数看起来像文档中的一样,我没有。所以现在我很困惑,有人可以给我比IEquatable更简单的示例吗?这是文档https://docs.microsoft.com/en-us/dotnet/api/system.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()
        }
    }
}

1 个答案:

答案 0 :(得分:1)

IEquatable<T>只是一个接口,它告诉您当前类型具有值相等语义,而不是引用相等。使两个不同的对象相等或不相等的逻辑背后的逻辑,完全取决于应用程序的业务逻辑,而不是正确或不正确地实现该接口的方式。

是什么使您的域中的两个类别相同?相同的Id?那么您的equals方法将是:

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;
}

以此类推。决定什么使两个类别彼此相等的人。

现在,关于哈希码。哈希码必须遵守的基本规则是:两个相等的类别必须具有相同的哈希码。请注意,这并不意味着两个具有相同哈希码的类别是相等的,哈希码会发生碰撞,根本没有问题。另外,如果对象发生更改,哈希码也不应更改,因此理想情况下,哈希码应基于无法更改的数据构建。

好吧,那么您将如何在特定情况下实现哈希代码?

情况1:

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

情况2:

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

两个哈希值都将与它们的Equals一致。唯一的问题是它们建立在潜在的可变数据上(Id和Name都有设置​​器),因此,如果其中任何一个发生更改,您的哈希码也将发生变化,这通常是个坏主意。

根据您的情况,您可能必须以不同的方式处理此问题。在执行任何对哈希敏感的操作时,您的数据可能会发生变化吗?例如,Linq广泛使用了散列...