2012-07-19 11 views
2

Bonjour j'essaie de modifier la valeur dans le dictionnaire, mais le compilateur lance KeyNotFoundException. Je suis sûr, j'ai déclaré cette clé dans le dictionnaire, parce que j'appelle la méthode GenerateEmptyChunks(), qui remplit le dictionnaire avec des morceaux avec la clé de leur position et les valeurs sont vides pour le générateur de niveau. J'ai vérifié debuger et l'objet dictionnaire Chunks est correctement rempli avec des clés et des valeurs. Est-ce causé par ma méthode CompareTo non fonctionnelle? Si oui, comment j'ai modifié la méthode CompareTo pour retourner les bonnes valeurs?KeyNotFoundException dans le dicton rempli

public Dictionary<WPoint, WChunk> Chunks = new Dictionary<WPoint, WChunk>(); 

GenerateEmptyChunks() Méthode:

public void GenerateEmptyChunks(int Xcount, int Ycount) 
    { 
     for(int x = 0; x <= Xcount; x++) 
     { 
      for (int y = 0; y <= Ycount; y++) 
      { 
       this.Chunks.Add(new WPoint(x, y), new WChunk(x, y)); 
      } 
     } 
    } 

AddBlock() de la méthode qui est appelée par le générateur de niveau pour chaque tuile:

public void AddBlock(WPoint location, int data) 
    { 
     this.Chunks[location.GetChunk()].AddTile(new WTile(location, data)); 
    } 

WChunk objet:

public class WChunk 
    { 
     public int ChunkX; 
     public int ChunkY; 
     public SortedDictionary<WPoint, WTile> Tiles = new SortedDictionary<WPoint, WTile>(); 

     public WChunk(int posX, int posY) 
     { 
      ChunkX = posX; 
      ChunkY = posY; 
     } 

     public void AddTile(WTile tile) 
     { 
      Tiles.Add(tile.GetLocation(), tile); 
     } 
    } 

WPoint objet:

public class WPoint : IComparable 
    { 
     public float X; 
     public float Y; 

     public WPoint(float x, float y) 
     { 
      X = x; 
      Y = y; 
     } 

     public WPoint GetChunk() 
     { 
      //Oprava pre bloky mensie ako (1,1) 
      if (X <= 16 && Y <= 16) 
      { 
       return new WPoint(0, 0); 
      } 
      else 
      { 
       double pX = (double)(X/16); 
       double pY = (double)(Y/16); 
       return new WPoint((int)Math.Floor(pX), (int)Math.Floor(pY)); 
      } 
     } 

     public int CompareTo(object obj) 
     { 
      WPoint point2 = (WPoint)obj; 
      if (point2.X == this.X && point2.Y == this.Y) 
      { 
       return 0; 
      } 
      else if (point2.X >= this.X && point2.Y >= this.Y) 
      { 
       return -1; 
      } 
      else 
      { 
       return 1; 
      } 
     } 
} 

Toutes les idées pourquoi clés Rejetant compilateur, quand ils sont dans le dictionnaire?

Répondre

3

Oui. Vous n'avez pas ignoré GetHashCode.

0

Le dictionnaire utilise les méthodes GetHashCode et Equals pour les comparaisons de clés, donc l'implémentation de l'interface IComparable n'est pas suffisante. Jetez un oeil à ce answer, c'est exactement ce dont vous avez besoin.

+0

Merci, cela fonctionne. –

Questions connexes