Frage

Ich habe eine Klasse Room, und eine Klasse World. Derzeit habe ich eine

    Dictionary<Point, Room> world;

, die ich speichere Rooms in etwa so:

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

Aber wenn ich versuche, darauf zuzugreifen, es gibt null zurück:

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

verstehe ich den Grund, warum dies geschieht. Aber meine Frage ist: Hat jemand wissen, einen besseren Weg, dies zu tun

War es hilfreich?

Lösung

Das sollte funktionieren, sofern Ihre Point Implementierung implementiert GetHashCode und Equals richtig.

Zum Beispiel folgendes funktioniert perfekt:

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

Dies ist mit System.Drawing.Point, die Geräte richtig GetHashCode. (Es druckt "2" ist, wie erwartet.)

Ich vermute, das Problem ist die Implementierung von Point. Stellen Sie sicher, dass es implementiert Equals und GetHashCode richtig, oder (noch besser) verwenden, um eine Version von Point enthielt im Rahmen.

Andere Tipps

Sie können geben Sie Ihre eigenen IEqualityComparer , wenn Sie das Wörterbuch instanziiert:

public Dictionary(IEqualityComparer<TKey> comparer)

Dies funktioniert auch, wenn Sie nicht die ursprüngliche TKey Klasse ändern können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top