我的示例中使用什么数据结构
我想创建一个组件,它由一块板和它的周围角落组成。 板的大小(因此也是边界的大小)在运行时定义。 一些例子(板子很亮,边框很暗): 替代文字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
- 如何在MessageBox中显示textBox控件?
- 获取由3d多边形包围的点
- AutomationElement使用Inspect.exe显示,但在使用UIAutomationCore.dll或System.Windows.Automation时不显示
- 为什么在单击ToolStrip按钮两次时抛出NullReferenceException – openFileDialog.showDialog()?
- 将模型和订阅密钥传递给LuisDialog而不是通过属性
- 获取ListView可见项目
- 如何在非表单应用程序中生成击键
- 如何设置WebClient Content-Type标头?
- 如何为.NET属性创建委托?