我的示例中使用什么数据结构

我想创建一个组件,它由一块板和它的周围角落组成。 板的大小(因此也是边界的大小)在运行时定义。 一些例子(板子很亮,边框很暗): 替代文字http://img340.imageshack.us/img340/3862/examplegw.png

该板由BoardCell类型的对象组成,边界由BorderCell类型的对象组成。 电路板的数据结构是BoardCell [,] – 一个简单的二维数组。

我怎样才能代表边界? 我从这样的事情开始:

public BorderCell TopLeft // top left corner cell public BorderCell TopRight // top right corner cell public BorderCell BottomRight // bottom right corner cell public BorderCell BottomLeft // bottom left corner cell public BorderCell[] Top // top border (without corners) public BorderCell[] Bottom // bottom border (without corners) public BorderCell[] Left // left border (without corners) public BorderCell[] Right // right border (without corners) 

我不喜欢边界的这种表示,你能提出更好的建议吗?

附加:我想在边框对象上有一个方法SetSomethingForTheCell:

 public void SetSomethingForTheCell(...) 

但是根据我目前的数据结构,我不知道该作为参数传递什么。

由于检测细胞是否是边界的一部分真的很简单,只需存储一次细胞并在需要时测试边界成员资格。

测试单元格是否在边框中的简单方法:

 // assuming that the array is in row-major order... public static bool IsInBorder(this BoardCell[,] board, int x, int y) { return x == board.GetLowerBound(1) || x == board.GetUpperBound(1) || y == board.GetLowerBound(0) || y == board.GetUpperBound(0); } 

我很想为BoardCell和BorderCell(即Cell?)定义一个公共接口或基类,并将它们保存在(更大的)二维数组中。 通过这种方式,您可以轻松地对每个单元进行寻址,并且可以非常轻松地确定地址是边框还是板。

我认为你可以使用一个普通的二维数组来表示整个板(带有边框的内板),你可以知道每个单元的类型,如果它在内板或边界中使用它的位置(即边框单元有x值0或宽度-1和y值0或高度-1)

我有一段时间没有使用过C#,所以我不能给你一个特定的答案。 但是我会将BorderCell作为BoardCell的子类(或者有一个共同的子类)。 正如您所说,您的电路板数据结构将是BoardCell类型的2Darrays。 实例化板时,将内部单元实例化为普通的BoardCells,并将边界实例化为BorderCells。

如果您认为可能需要循环遍历边界等,请使用yield运算符在Board类中为每种类型的循环(例如,角,顶部边框,底部边框等)定义迭代器。

至于你的public void SetSomethingForTheCell(...)而不是我将提供单元格元素的访问者/属性。 例如:

 BoardCell cell = board.getCell(i,j); cell.setSomething(data) 

BoardCell和BorderCell是相关的(或者你可以从一个共同的基类派生出来)吗?

如果是这种情况,您可以使用单个BaseCell [,]数组,并让Board和Border之间的区别由类类型和/或位置定义。


否则,边框的单调数组:`new BorderCell [2 * rows + 2 * cols + 4];

如上所述,您可以创建一个名为Cell(或左右)的基类,并从中inheritance。 例如:

 BoardCell is a cell with 3 values: x, y, bool isBorder Board is a cell with 3 values: x, y, array Cells