2011-08-15 2 views
0

Ceci est une question de projet que je viens de cant semblent répondreC# définition de la classe AIDE

using System; 

namespace ConsoleApplication2 
{ 
    internal class Equipment : IComparable 
    { 
     private readonly string type; 
     private readonly int serialNo; 
     private string colour; 
     public decimal cost; 

     public Equipment(string type, int serialNo) 
     { 
      this.type = type == null ? "" : type.Trim(); 
      this.serialNo = serialNo; 
     } 

     public string Key 
     { 
      get { return type + ":" + serialNo; } 
     } 

     int IComparable.CompareTo(object obj) 
     { 
      return 0; 
     } 
    } 
} 

(a) Remplacer la méthode o assurer que les différentes instances de la classe appropriée qui représentent le même point de l'équipement sera considéré la même chose dans le système.

(b) Remplacer la méthode appropriée pour permettre aux instances de cette classe à stocker (et trouvé) par clé dans une table de hachage

+1

le point clé est que les méthodes que vous devriez rechercher ne se trouvent pas dans cette classe directement, mais plutôt dans la classe que cette classe hérite de. –

Répondre

0

écriture GetHashCode est manuellement pas si simple. Quoi qu'il en soit, c'est du code généré à cet effet par ReSharper. C'est une solution complète. (Il devrait être contenu dans votre définition de classe bien sûr). Mais que diriez-vous, si on vous demandait - pourquoi et comment cela fonctionne? Cela pourrait être embarrassant.

Ainsi, en dehors de GetHashCode et Equals, que d'autres ont suggéré que vous lire à propos, vous pouvez également rechercher http://msdn.microsoft.com/en-us/library/system.object.referenceequals.aspx ainsi que http://msdn.microsoft.com/en-us/library/a569z7k8(v=VS.100).aspx

En ce qui concerne le mystère derrière 397 en GetHashCode, jetez un oeil à cette question ici sur StackOverflow: Why is '397' used for ReSharper GetHashCode override?

 public bool Equals(Equipment other) 
     { 
      if (ReferenceEquals(null, other)) 
      { 
       return false; 
      } 
      if (ReferenceEquals(this, other)) 
      { 
       return true; 
      } 
      return Equals(other.colour, colour) && other.cost == cost && other.serialNo == serialNo && Equals(other.type, type); 
     } 

     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) 
      { 
       return false; 
      } 
      if (ReferenceEquals(this, obj)) 
      { 
       return true; 
      } 
      if (obj.GetType() != typeof (Equipment)) 
      { 
       return false; 
      } 
      return Equals((Equipment) obj); 
     } 

// note: if "Override the appropriate method to enable instances of this class 
// to be stored (and found) by key in a hash table" is supposed to mean that only type and 
// serialNo should be taken into account (since they are used to generate 
// the Key value) - just remove the lines with cost and colour 
     public override int GetHashCode() 
     { 
      unchecked 
      { 
       int result = (colour != null ? colour.GetHashCode() : 0); 
       result = (result*397)^cost.GetHashCode(); 
       result = (result*397)^serialNo; 
       result = (result*397)^(type != null ? type.GetHashCode() : 0); 
       return result; 
      } 
     } 
3

Vous devez remplacer les méthodes equals et GetHashCode à cet effet.