【发布时间】:2013-12-01 10:01:07
【问题描述】:
我将康威人生游戏的一个版本构建为 C# Windows 窗体应用程序。 该表单包含一个 TableLayoutPanel,并且该表的每个单元格都包含一个表单控件。 最初,我有以下课程:
网格
int Rows
int Cols
List<Row> RowList
行
List<Cell> CellList
单元格
bool IsAlive
Button b
int ColIndex
int RowIndex
代码构建了一个网格对象,没有。行和列作为参数,然后将每个单元格按钮控件放置到 TableLayoutPanel 的相关行和列中的表单上。
我完成了游戏的开发,一切正常。我的最大网格尺寸为 50x50,运行非常流畅。
然后我想了想,决定我最好使用 CheckBox 控件而不是 Button 控件。这将否定 Cell 类中对布尔 IsAlive 的需要,因为我可以只使用 CheckBox 选中的属性。我还决定单元格对象不需要包含行和列索引,因为我可以通过获取 TableLayoutPanel 中的控件位置来确定这些。这也让我觉得不需要 Row 类。我可以只拥有一个包含一组单元格的网格。
我以新的方式重新编写了应用程序,认为这将是一个更清洁的解决方案,但现在它在性能方面运行得非常非常慢。
主要处理代码是相同的,除了原来它必须这样做:
foreach (Row r in RowList)
{
foreach (Cell c in CellList)
{
// Do stuff
}
}
它现在在哪里:
foreach (Cell c in CellList)
{
// Do Stuff
}
我不明白为什么第二个版本这么慢。是因为单元格的集合更大而不是分解成行吗?或者与我使用 CheckBox 对象而不是按钮这一事实有关?
任何帮助将不胜感激!
【问题讨论】:
-
一般来说,最好将底层数据结构(单元格列表)和表示(按钮/复选框)尽可能分开。否则,您将程序逻辑与显示方法紧密耦合。仅出于这个原因,我不确定使用复选框的“已检查”属性而不是布尔值来存储状态是最好的举动。
-
谢谢我感谢建设性的批评。 C# 对我来说是新手,也是我第一次接触 OO 编程。我的背景是 IBM iSeries 和 RPG。
标签: c# list button checkbox collections