IEquatable 文档令人困惑
IEquatable Documentation is confusing
您好,我正在尝试将 IEquatable 添加到我的程序中,但我不知道是否需要基本添加唯一 ID 和哈希码?他们使用 shd 编号作为 IEquatable 中的唯一 ID,但他们在构造函数中赋予它值,我在该站点上询问是否需要构造函数看起来像文档中那样,我得到了否定。所以现在我很困惑,有人能给我一个比文档更简单的 IEquatable 示例吗?这是文档 https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netcore-3.1 的 link 我只是想获取自定义对象列表的包含。
我的代码
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()
}
}
}
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;
}
等等。由您来决定是什么让两个类别彼此相等。
现在,关于哈希码。哈希码必须遵守的基本规则是:两个相同的类别必须具有相同的哈希码。请注意,这并不意味着具有相同哈希码的两个类别相等,哈希码会发生冲突,这完全没有问题。此外,哈希码不应在对象更改时更改,因此理想情况下,它们应建立在无法更改的数据之上。
好的,那么你将如何在你的特定场景中实现你的哈希码?
案例一:
public override int GetHashCode() => _Id.GetHashCode();
案例二:
public override int GetHashCode() => _Id.GetHashCode() ^
_Name.GetHashCode();
两个哈希值都将与其 Equals
对应的哈希值一致。唯一的问题是它们建立在可能可变的数据上(Id 和 Name 都有设置器)所以如果其中任何一个发生变化,你的哈希码也会改变,这通常是个坏主意。
根据您的情况,您可能需要以不同方式处理此问题。在执行任何散列敏感操作时,您的数据是否可能发生变异?例如,Linq 非常广泛地使用哈希...
您好,我正在尝试将 IEquatable 添加到我的程序中,但我不知道是否需要基本添加唯一 ID 和哈希码?他们使用 shd 编号作为 IEquatable 中的唯一 ID,但他们在构造函数中赋予它值,我在该站点上询问是否需要构造函数看起来像文档中那样,我得到了否定。所以现在我很困惑,有人能给我一个比文档更简单的 IEquatable 示例吗?这是文档 https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netcore-3.1 的 link 我只是想获取自定义对象列表的包含。
我的代码
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()
}
}
}
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;
}
等等。由您来决定是什么让两个类别彼此相等。
现在,关于哈希码。哈希码必须遵守的基本规则是:两个相同的类别必须具有相同的哈希码。请注意,这并不意味着具有相同哈希码的两个类别相等,哈希码会发生冲突,这完全没有问题。此外,哈希码不应在对象更改时更改,因此理想情况下,它们应建立在无法更改的数据之上。
好的,那么你将如何在你的特定场景中实现你的哈希码?
案例一:
public override int GetHashCode() => _Id.GetHashCode();
案例二:
public override int GetHashCode() => _Id.GetHashCode() ^
_Name.GetHashCode();
两个哈希值都将与其 Equals
对应的哈希值一致。唯一的问题是它们建立在可能可变的数据上(Id 和 Name 都有设置器)所以如果其中任何一个发生变化,你的哈希码也会改变,这通常是个坏主意。
根据您的情况,您可能需要以不同方式处理此问题。在执行任何散列敏感操作时,您的数据是否可能发生变异?例如,Linq 非常广泛地使用哈希...