1

クラスRoomと クラス がありWorldます。現在、私は

    Dictionary<Point, Room> world;

Room私は次のようにsを保存します:

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

しかし、アクセスしようとすると、null が返されます。

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

これが起こっている理由を理解しています。しかし、私の質問は次のとおりです。これを行うためのより良い方法を知っている人はいますか?

4

2 に答える 2

8

実装が適切に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。それが正しく実装されていることを確認するEqualsか、(できれば) フレームワークに含まれている Point のバージョンを使用してください。GetHashCode

于 2011-01-15T01:02:57.633 に答える
1

辞書をインスタンス化するときに、独自の IEqualityComparer を提供できます。

public Dictionary(IEqualityComparer<TKey> comparer)

これは、元の TKey クラスを変更できない場合でも機能します。

于 2011-01-15T01:26:30.513 に答える