C#康威的生命游戏

时间:2013-11-18 09:47:19

标签: c# list button checkbox collections

我构建了Conway作为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 checked属性。我还决定不需要单元格对象包含行和列索引,因为我可以通过获取TableLayoutPanel中的控件位置来确定它们。这也让我觉得没有必要使用Row类。我可以拥有一个包含Cell集合的Grid 我以新的方式重新编写应用程序,认为它将是一个更清晰的解决方案,但现在它运行得多,在性能方面要慢得多。 主处理代码是相同的,除了最初必须这样做:

foreach (Row r in RowList)
{
    foreach (Cell c in CellList)
    {
        // Do stuff
    }
}

现在只是这样:

foreach (Cell c in CellList)
{
    // Do Stuff
}

我无法理解为什么第二个版本会慢得多。是因为细胞的收集要大得多,而不是分成几行?或者与我使用CheckBox对象而不是按钮的事实有什么关系?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您没有显示更改“已检查”属性的代码,因此这是猜测,但是:

如果您的算法经常使用控件的“Checked”属性,那么它将非常慢,因为当属性的状态发生变化时,它将更新UI内容的负载。它将需要更新显示状态以显示交叉。

如果你只使用普通布尔,它会非常快。对bool使用Control属性可能会慢几千倍。