首页 > 解决方案 > winforms C# .NET - 如何在使用循环时提高代码的性能(for、foreach 等...)

问题描述

我正在为大学开发一个应用程序,该应用程序的一部分是设置每周的课程表。

我的参数是教室编号、星期几和时间段。

所以我有一系列的教室,每个教室都有一个编号。

在运行时,该应用程序会根据我的数据库中的教室数量生成一些按钮,并在每个按钮上设置教室编号。

如果某个教室在给定的星期几和给定的时间段内已满,我想要做的是用“红色”背景色标记每个教室按钮。

我已经完成了我想做的事情,我的代码没有错误,但我现在唯一的问题是性能。

这是我的代码:

private OleDbConnection Connection = new OleDbConnection();


private void SomeMethod(string Day, string Time)
    {
        int MaxIndex = 0;
        string str1 = "select Max([Row Index]) from Table";       
      OleDbCommand Command1 = new OleDbCommand(str1, Connection);
        Connection.Open();
        if (Command1.ExecuteScalar() == DBNull.Value)
            MaxIndex = 1;

        else
            MaxIndex = Convert.ToInt32(Command1.ExecuteScalar());
        Connection.Close();

        for (int i = 0; i < MaxIndex; i++)
        {
            string str = "select [classroom Number] from Table where [Day] = @ParamDay and [Time] = @ParamTime and [Row Index] = @ParamIndex";

            OleDbCommand Command = new OleDbCommand(str, Connection);
            Command.Parameters.Add("@ParamDay", Day);
            Command.Parameters.Add("@ParamTime", Time);
            Command.Parameters.Add("@ParamIndex", i + 1);

            Connection.Open();
            OleDbDataReader reader = Command.ExecuteReader();

            if (reader.Read())
            {
                foreach (Button btn in ButtonsPanel.Controls)
                {
                    if (btn.Text == reader["classroom Number"].ToString())
                    {
                        btn.BackColor = Color.Red;
                    }

                }
                Connection.Close();
            }
        }


    }
    

因此,如果我希望有 200 行,则此代码大约需要 13 秒。

问题是......我可以对我的代码做些什么,以使这 13 秒减少到至少 2-4 秒?

信息:我在互联网上搜索了很多,但在这里找不到我的问题的解决方案。

标签: c#.netwinforms

解决方案


您似乎根本不需要 for 循环。和MaxIndex任何一个。只需下载时间记录和标记按钮即可。

private void SomeMethod(string Day, string Time)
{
    HashSet<string> classNumbers = new HashSet<string>();

    string str = "select [classroom Number] from Table where [Day] = @ParamDay and [Time] = @ParamTime";
    using (OleDbCommand Command = new OleDbCommand(str, Connection))
    {
        Command.Parameters.Add("@ParamDay", Day);
        Command.Parameters.Add("@ParamTime", Time);                
        Connection.Open();
        using (OleDbDataReader reader = Command.ExecuteReader(CommandBehavior.CloseConnection))
        {
            while (reader.Read())
            {
                classNumbers.Add(reader["classroom Number"].ToString());
            }
        }
    }

    foreach (Button btn in ButtonsPanel.Controls)
    {
        if (classNumbers.Contains(btn.Text))
        {
            btn.BackColor = Color.Red;
        }
    }
}

推荐阅读