2012-07-19 5 views
2

안녕하세요, 나는 값을 사전에 수정하려고하지만 컴파일러는 KeyNotFoundException을 던졌습니다. 확실한 것은 사전에 그 키를 선언했기 때문입니다. GenerateEmptyChunks() 메서드를 호출했습니다.이 메서드는 레벨 생성기에 대해 값이 비어있는 위치와 키가있는 청크로 사전을 채 웁니다. 나는 디버거를 검사했고 Chunks 사전 개체가 키와 값으로 올바르게 채워져 있습니다. 그것은 내 unworking CompareTo 방법으로 인해 발생합니까? 그렇다면 올바른 값을 반환하기 위해 CompareTo 메서드를 수정하는 방법은 무엇입니까?KeyNotFoundException 가득 차있는 dictonary

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

GenerateEmptyChunks()있어서

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() 각 타일 레벨 발생기라고있어서

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

WChunk 개체 :

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 객체 : 그들은 사전에

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; 
      } 
     } 
} 

이유는 컴파일러가 키를 거부되는 모든 아이디어를 있습니까?

답변

3

예. GetHashCode를 재정의하지 않았습니다.

0

사전은 키 비교에 GetHashCode 및 Equals를 사용하므로 IComparable 인터페이스를 구현하는 것만으로는 충분하지 않습니다. 이 answer을보세요. 정확히 필요한 것입니다.

+0

고맙습니다. 작동합니다. –

관련 문제