2011-01-15 3 views
1

나는 Room 클래스와 World 클래스를 가지고있다. 현재 내가 가지고 내가 같은에서 Room의 저장C# 좌표 키가있는 사전

Dictionary<Point, Room> world; 

:

world.Add(new Point(0,0), new Room()); 

을하지만 그것을 액세스하려고 할 때, 그것은 null을 반환 :

world.Get(new Point(0,0)); 

나는 이해 이것이 일어나는 이유. 하지만 내 질문은 : 누구든지 이것을하는 더 좋은 방법을 알고 있습니까?

+0

사전 <>을 사용하는 이유 (설계 이유)는 무엇입니까? –

+0

대 배열? 나는 "방"을 포함하는 텍스트 기반 게임을 위해 이것을 만들고 있습니다. 만약 당신이 존재하지 않는 방에 들어가면, 방을 만들 수 있습니다. 모든 크기 조정 및 물건과 함께 배열을 사용하는 것은 목에 통증이 될 것이므로 사전과 함께갔습니다. – Entity

+0

"포인트"클래스입니까? 그렇지 않다면 어떤 "Point"클래스/구조체를 사용하고 있습니까? –

답변

7

Point 구현시 GetHashCodeEquals을 올바르게 구현하면 정상적으로 작동합니다. 예를 들어

완벽하게 다음 작품 :

using System; 
using System.Collections.Generic; 
using System.Drawing; 

class Room 
{ 
    public int X 
    { 
     get; 
     set; 
    } 
} 

struct Program 
{ 
    static void Main() 
    { 
     Dictionary<Point, Room> world = new Dictionary<Point, Room>(); 

     world.Add(new Point(0, 0), new Room() { X = 0 }); 
     world.Add(new Point(2, 3), new Room() { X = 2 }); 

     Room room = world[new Point(2, 3)]; 

     Console.WriteLine(room.X); 
     Console.ReadKey(); 
    } 
} 

이 제대로 GetHashCode를 구현 System.Drawing.Point를 사용하고 있습니다. (예상대로 "2"가 인쇄됩니다.)

고객님의 구현은 Point입니다. EqualsGetHashCode이 올바르게 구현되었는지 확인하거나 프레임 워크에 포함 된 Point 버전을 사용하는 것이 좋습니다.

+0

내 클래스 대신 System.Windows.Point를 사용하면 완벽하게 작동했습니다. 감사! – Entity

+2

@TheAdamGaskins : 문제는 클래스/구조체가 사전에서 키로 사용하려는 경우 Equals + GetHashCode를 올바르게 구현해야한다는 것입니다 ... –

1

당신 provide your own IEqualityComparer 수 있습니다 당신은 사전을 인스턴스화 할 때

public Dictionary(IEqualityComparer<TKey> comparer) 

이 원래 TKEY 클래스를 수정할 수없는 경우에도 작동합니다.

+1

사전이 O (n)에서 작동한다는 것을 의미합니다. 더 이상 해시가 아닙니까? –