2011-07-15 3 views
1

J'ai une entité symbole par rapport à l'autre a ce comportement:Comment implémenter cette égalité personnalisée?

  1. Si FileName & FileDate sont égaux, retour vrai
  2. Si FileDate est différent, puis comparez le CRC32 de chacun et de retour que la valeur

Je me demande comment implémenter cette égalité, en particulier le GetHashCode() dans ce cas.

+1

Est-ce que votre question est de savoir comment implémenter un GetHashCode() en particulier, ou quels champs inclure? La principale chose avec les codes de hachage est que c'est correct pour des choses différentes d'avoir le même code de hachage (mais pas optimal) mais c'est très mauvais pour des choses équivalentes d'avoir différents codes de hachage. Donc, au minimum, vous voulez choisir le plus petit dénominateur commun des champs d'équivalence pour un code de hachage. Dans votre cas, cela ressemble à FileName. (Je suppose sur le # 2 quand vous dites "si FileDate est différent" vous induisez que le FileName est toujours le même, droit? –

+0

Qu'avez-vous écrit jusqu'ici dans votre 'override' de' Equals() '? –

+0

Ok Je m'inquiétais du GetHashCode(). Cela l'efface. – Sunit

Répondre

1

Je dirais (sur la base de ma compréhension de votre exemple), quelque chose comme ça. Vous pourriez inclure un code de hachage plus complexe qui est parallèle à votre FileDate vs CRC32, mais vraiment puisque la colle commune est toujours le FileName que vous pourriez simplement utiliser comme votre code de hachage de substitution. Rappelez-vous, les objets Equal() ne doivent jamais avoir des codes de hachage différents, mais les objets! Equal() peuvent avoir le même (c'est juste une collision potentielle).

vous aurez également besoin d'être prudent sur les champs qui font partie du code de hachage étant mutable, sinon le code de hachage de l'objet peut « changement » qui pourrait être très mauvais dans un dictionnaire ...

public sealed class Symbol : IEquatable<Symbol> 
    { 
     public string FileName { get; set; } 
     public DateTime FileDate { get; set; } 
     public long CRC32 { get; set; } 

     public bool Equals(Symbol other) 
     { 
      if (other == null) 
      { 
       return false; 
      } 

      return FileName == other.FileName && 
        (FileDate == other.FileDate || CRC32 == other.CRC32); 
     } 

     public override bool Equals(object obj) 
     { 
      return Equals(obj as Symbol); 
     } 

     public override int GetHashCode() 
     { 
      // since FileName must be equal (others may or may not) 
      // can use its hash code as your surrogate hash code. 
      return FileName.GetHashCode(); 
     } 
    } 
0
 public override bool Equals(object obj)  
    {   
    var file = obj as Symbol; 
    if (file.FileName == FileName && file.FileDate == FileDate) 
     return true 
    else  
return Boolean Value of [Compare CRC Here];  
     } 

Voici comment vous pouvez calculer le CRC sur un fichier.

http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net

C'est essentiellement ce que James Michael Hare a suggéré que j'étais plus lent.

Questions connexes