我希望将字典嵌套在另一个中,以便容纳块的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提供的答案的组合。
如果有办法标记多个答案,请告诉我,否则我只是将列表中的第一个答案标记为答案。
答案 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'哦!