C # координатный словарь - PullRequest
       29

C # координатный словарь

1 голос
/ 15 января 2011

У меня есть класс Room и класс World.В настоящее время у меня есть

    Dictionary<Point, Room> world;

, в котором я храню Room s примерно так:

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

Но когда я пытаюсь получить к нему доступ, он возвращает null:

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

Я понимаю причину, по которой это происходит.Но мой вопрос: кто-нибудь знает лучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 15 января 2011

Это должно работать нормально, если ваша Point реализация реализует GetHashCode и Equals должным образом.

Например, отлично работает следующее:

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

Это использует System.Drawing.Point, который правильно реализует GetHashCode. (Он печатает «2», как и ожидалось.)

Я подозреваю, что проблема в вашей реализации Point. Убедитесь, что он правильно реализует Equals и GetHashCode или (еще лучше) использует версию Point, включенную в каркас.

1 голос
/ 15 января 2011

Вы можете предоставить свой собственный IEqualityComparer при создании словаря:

public Dictionary(IEqualityComparer<TKey> comparer)

Это работает, даже если вы не можете изменить исходный класс TKey.

...