c# - Dictionary(of T) 中的 KeyNotFound 异常

标签 c# dictionary equals keynotfoundexception

我已经准备好用头撞墙了

我有一个名为 Map 的类,它有一个名为 tiles 的字典。

class Map
{
    public Dictionary<Location, Tile> tiles = new Dictionary<Location, Tile>();
    public Size mapSize;

    public Map(Size size)
    {
        this.mapSize = size;
    }
   //etc...

我临时填了这本字典来测试一些东西..

public void FillTemp(Dictionary<int, Item> itemInfo)
    {
        Random r = new Random();
        for(int i =0; i < mapSize.Width; i++)
        {
            for(int j=0; j<mapSize.Height; j++)
            {
                Location temp = new Location(i, j, 0);

                int rint = r.Next(0, (itemInfo.Count - 1));

                Tile t = new Tile(new Item(rint, rint));

                tiles[temp] = t;
            }
        }

    }

在我的主程序代码中

Map m = new Map(10, 10);
m.FillTemp(iInfo);
Tile t = m.GetTile(new Location(2, 2, 0)); //The problem line

现在,如果我在我的代码中添加一个断点,我可以清楚地看到我的 map 类实例 (m) 通过上面的函数充满了对,但是当我尝试使用 GetTile 函数访问一个值时:

    public Tile GetTile(Location location)
    {
        if(this.tiles.ContainsKey(location))
        {
            return this.tiles[location]; 
        }
        else
        {
            return null;
        }
    }

它总是返回 null。同样,如果我查看 Map 对象内部并在 x=2,y=2,z=0 处找到 Location 键,我清楚地看到该值是 FillTemp 生成的 Tile..

为什么要这样做?到目前为止,我对这样的字典没有任何问题。我不知道为什么它返回 null。再一次,在调试时,我可以清楚地看到 Map 实例包含 Location 键,它说它不...... 非常令人沮丧。

有什么线索吗?需要更多信息吗?

帮助将不胜感激:)

最佳答案

您没有显示“位置”是什么,但如果它是一个类,这是正常行为:通过比较引用来测试对象是否相等。因此 Location 的不同实例将始终不相等,即使它们的内容相同也是如此。

最快的解决方法是 override Equals()和 Location 类的 GetHashCode()。然后将其(重新)设计为不可变类(或者可能是不可变结构)是个好主意。

关于c# - Dictionary(of T) 中的 KeyNotFound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2442970/

相关文章:

c# - 当我在 Visual Studio(设计器 View )中重建时,我的 userControl 中的更改被删除

javascript - ES6 Map 迭代成本

python - 使用外部文件定义字典键的值列表

javascript - 在二维数组中搜索

java - MeanBean EqualsMethodTester 和 HashCodeMethodTester 的自定义属性工厂

c# - 如何监控/嗅探本地 DNS 查找到 Windows 本地 DNS? (在 XP、Vista、Win7 上)

c# - 如何使用 DirectShow NET 捕获音频和视频?

c# - 如何仅从 Request.UserAgent 获取操作系统?

python - 为什么 map 像 izip_longest with fill=None 一样工作?

java - .equals() 的问题