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

时间:2010-06-29 11:42:27

标签: c# data-structures

我想创建一个组件,它由一块板和它的周围角落组成。板的大小(因此也是边界的大小)在运行时定义。一些例子(板子很亮,边框很暗): alt text 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(...)

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

6 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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


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

答案 4 :(得分:2)

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

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

关于你的public void SetSomethingForTheCell(...),我会提供单元格元素的访问者/属性。例如:

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

答案 5 :(得分:1)

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

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