c# - 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 秒?
信息:我在互联网上搜索了很多,但在这里找不到我的问题的解决方案。
解决方案
您似乎根本不需要 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;
}
}
}
推荐阅读
- ssl - 用于数据连接的 FTPS 客户端程序
- vba - 工作表的变量名
- c++ - 将图像复制到另一个图像的部分
- c# - 在 IIS 上托管 .NET Core API + 网站
- c - 如何使用 yarpgen 随机 C 程序生成器?
- smalltalk - 在 Centos 7.4x 上将 OSSubprocess 添加到我的 Pharo 6.1 时出错
- c# - 如何从配置文件加载统一设置?
- docker - Docker ubuntu cron 尾部日志不可见
- javascript - 使用 CSS API 在 Material UI Stepper 中覆盖 CSS 样式
- c++ - c++ strftime 我不知道的东西