根据对象的某些属性创建唯一的哈希码

Mas*_*oud 5 c# hash compare

我必须遵循以下课程:

public class NominalValue
{
   public int Id {get; set;}
   public string ElementName {get; set;}
   public decimal From {get; set;}  
   public decimal To {get; set;}    
   public bool Enable {get; set;}   
   public DateTime CreationDate {get; set;}
   public int StandardValueId {get; set;}  //FK for StandardValue
} 
public class StandardValue
{
   public int Id {get; set;}
   public string ElementName {get; set;}
   public decimal From {get; set;}  
   public decimal To {get; set;}    
   public bool Enable {get; set;}   
   public DateTime CreationDate {get; set;}
} 
Run Code Online (Sandbox Code Playgroud)

用户想要填充nominalValue对象属性。填充nominalValue属性可以通过两种方式执行:

  1. 用户nominalValue手动填充值。
  2. 用户nominalValuestandardValue对象加载值,然后更改或不更改某些值。

有时我需要知道nominalValue指定元素的对象的某些属性是否等于对应的standardValue

我不希望加载standardValueDb检查这种平等,所以我决定来定义HashValue财产NominalValue类:

public class NominalValue
{
   public int Id {get; set;}
   public string ElementName {get; set;}
   public decimal From {get; set;}  //<-- 1st parameter for generating hash value
   public decimal To {get; set;}    //<-- 2nd parameter for generating hash value
   public bool Enable {get; set;}   //<-- 3rd parameter for generating hash value 
   public DateTime CreationDate {get; set;}
   public int StandardValueId {get; set;}  
   public string HashValue {get;set;}      //<-- this property added
} 
Run Code Online (Sandbox Code Playgroud)

用户填充时nominalValue使用的属性standardValue的属性,我计算其值根据3个特性(FromToEnable),并将其保存与其他属性,并且当我如果检查nominalValue填充有standardValue或没有,我计算散列码FromToEnable并比较其结果HashValue(而是standardValueDb)加载。

是否有任何机制可以根据 3 个属性值(From, To, Enable)计算唯一的哈希码?

Que*_*ger 5

你可以尝试做这样的事情:

private int GetHashValue() {
    unchecked 
    {
        int hash = 17;
        //dont forget nullity checks 
        hash = hash * 23 + From.GetHashCode();
        hash = hash * 23 + To.GetHashCode();
        hash = hash * 23 + Enable.GetHashCode();
        return hash;
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以在匿名类型上使用 GetHashCode 方法

private int GetHashValue() {
   return new { From, To, Enable }.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)