首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEquatable文档令人困惑

IEquatable文档令人困惑
EN

Stack Overflow用户
提问于 2020-05-04 09:54:32
回答 1查看 136关注 0票数 0

嗨,我正在尝试将IEquatable添加到我的程序中,我不知道我是否需要添加一个唯一的基本id和一个哈希码?他们在IEquatable中使用shd编号作为唯一的id,但是他们在构造函数中给出了它的值,我在这个站点上询问是否需要构造函数,就像文档中的构造函数一样,我得到了否定。所以现在我很困惑,有人能给我一个更简单的IEquatable例子吗?下面是我正在尝试获取的文档https://learn.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netcore-3.1的链接,以便自定义对象列表工作。

我的代码

代码语言:javascript
复制
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()
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-04 10:20:17

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

是什么使两个类别在您的领域是相同的?同样的Id?那么您的等价物方法将是:

代码语言:javascript
复制
public bool Equals(Category other)
{
    if (other == null)
        return false;

    return _Id == other._Id;
}

同样的身份证和名字?

代码语言:javascript
复制
public bool Equals(Category other)
{
    if (other == null)
        return false;

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

诸若此类。是你决定了是什么使两类人平等。

现在,关于哈希码。哈希代码必须遵守的基本规则是:两个相等的类别必须具有相同的哈希代码。请注意,这并不意味着具有相同哈希代码的两个类别是相等的,哈希代码可能会发生冲突,这一点根本没有问题。此外,如果对象发生变化,哈希代码不应更改,因此理想情况下,它们应该建立在不能更改的数据之上。

好的,那么您将如何在您的特定场景中实现您的哈希代码?

案例1:

代码语言:javascript
复制
public override int GetHashCode() => _Id.GetHashCode();

案例2:

代码语言:javascript
复制
public override int GetHashCode() => _Id.GetHashCode() ^
                                     _Name.GetHashCode();

这两个散列都将与它们的Equals对应物一致。唯一的问题是它们是建立在潜在的可变数据之上的( Id和Name都有setter),所以如果这些更改中的任何一个,您的已有代码也会改变,这通常是个坏主意。

根据您的场景,您可能需要以不同的方式处理这个问题。在执行任何对哈希敏感的操作时,您的数据可能会发生变异吗?例如Linq广泛使用散列..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61589475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档