【问题标题】:IEquatable Documentation is confusingIEquatable 文档令人困惑
【发布时间】:2020-08-18 17:12:10
【问题描述】:

您好,我正在尝试将 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()
        }
    }
}

【问题讨论】:

  • 什么是“shd 号”? (还有一些标点符号可以帮助 - 至少我 - 更好地理解你的问题)
  • 你能分享你的代码吗,也许我们会帮助理解这个问题?
  • I am just trying to get contains for a custom object list to work - 然后实现 GetHashCodeEquals?
  • 添加完成的代码
  • 是的,但问题是如何实现这一点,我的意思是如果有更简单的方法来举例说明 IEquatable

标签: c# list contains iequatable


【解决方案1】:

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

是什么让您的域中的两个类别相同?同一个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;
}

等等。是你决定什么使两个类别彼此相等。

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

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

案例一:

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

案例 2:

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

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

根据您的情况,您可能必须以不同的方式处理此问题。在执行任何哈希敏感操作时,您的数据是否可能发生变异?例如,Linq 非常广泛地使用哈希......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2017-05-30
    • 2016-11-11
    相关资源
    最近更新 更多