试图使用Dictionary <dictionary <int,int =“”>,Dictionary <int,int =“”>&gt;建议</int,> </dictionary <int,>

时间:2009-12-14 17:48:59

标签: c# .net

我希望将字典嵌套在另一个中,以便容纳块的x坐标。所以我会

IDictionary<IDictionary<int, int>, IDictionary<int, int>>

并且键字词将包含列,行组合,而值Dictionary将包含x和y坐标。在用户输入平面上块的值后,它将用于绘制2D线框。

我有几个问题: 1)我可能遇到哪些陷阱? 2)是否有更好的方法来应对这一挑战?

谢谢

更新由于两个不同的建议导致使用的解决方案,因此不确定如何标记答案。我最终得到了:

IDictionary<KeyValuePair<int, int>, Point>

并且每个块将下一个块的x,y坐标设置为右侧和下一个块。

这是Mehrdad Afshari,Reed Copsey和CSharpAtl为KeyValuePair和Cory Charlton为Point提供的答案的组合。

如果有办法标记多个答案,请告诉我,否则我只是将列表中的第一个答案标记为答案。

7 个答案:

答案 0 :(得分:5)

您是否尝试将一对整数映射到字典?如果是这种情况,你应该使用类似的东西:

Dictionary<Tuple<int, int>, Dictionary<int,int>>

您当前正在做的事情是将IDictionary对象(一种引用类型)映射到另一个IDictionary实例。它只是检查密钥的引用相等性(标识),根本不考虑密钥字典的内容。

如果您尝试将包含一组值的键映射到字典(例如,在记忆和动态编程中有用),则需要声明自己的比较器以比较键的内容而不是仅考虑他们的参考。

答案 1 :(得分:4)

为什么不创建一个简单的块类:

struct Block
{
    public int X {get; set;}
    public int Y {get; set;}
    public int Column {get; set;}
    public int Row {get; set;}
}

一个简单的IEnumerable<Block> blocks。这样可以使您的数据输入类型更强,更易于维护。

答案 2 :(得分:4)

这似乎更有意义:

Dictionary<KeyValuePair<int,int>, KeyValuePair<int,int>>

主要问题是XY坐标对(基本上都是键和值)实际上不应该是字典 - 只有一个唯一的对值。

这应该可以正常工作。

答案 3 :(得分:2)

我发表评论,以为我会回答......:)

键应为KeyValuePair<int, int>,而不是Dictionary<int, int>

答案 4 :(得分:1)

你将如何绘制线框?使用GDI +?如果是这样,为什么不将值存储为Point()?

答案 5 :(得分:0)

只需使用数据表。当然你可以复制一些关键信息,但它只有一个整数,并且在跟踪kvp时会给你带来很大的麻烦。

答案 6 :(得分:0)

我认为你不想要一个IDictionary<int, int>密钥,至少不是你描述它的方式。根据你的说法,你只需要一对x,y对作为密钥。为什么不为此创建一个不可变的结构呢?

public struct OrderedPairKey
{
    private readonly int _x;
    private readonly int _y;
    public OrderedPairKey(int x, int y)
    {
        _x = x;
        _y = y;
    }
    public int X { get { return _x; } }
    public int Y { get { return _y; } }
}

不可变的结构仍然有它们的位置,并且作为字典键是完美的。

编辑:哦,废话。忘了KeyValuePair<int, int>。 D'哦!