祝大家一切顺利。
我有一个关于迭代的快速问题。我读过几篇关于迭代速度的文章,但我不知道如何让我的迭代更快。目前我正在做这样的事情:
void Iteration()
{
//Creating and filling the datatable
DataTable dt = new DataTable();
dt.Columns.Add("Datetime", typeof(DateTime));
for (int i = 0; i < 150; i++)
{
DataRow row = dt.NewRow();
row["Datetime"] = DateTime.Now.AddDays(i);
dt.Rows.Add(row);
}
//Creating and filling the list
List<DateTime> _listDates = new List<DateTime>();
DateTime _startDate = DateTime.Now.AddMonths(-1);
for(int i = 0; i < 250; i++)
_listDates.Add(_startDate.AddDays(i));
//Here's the actual iteration
foreach (DateTime _date in _listDates)
{
foreach (DataRow row in dt.Rows)
{
if ((DateTime)row["Datetime"] == _date)
{
//Do something.........
}
}
}
}
我分别用250和150行/行填充List<DateTime>
和DataTable
。然后,我想将这两个值相互比较,并在匹配时执行一些操作。然而,在我的方法中,这意味着250 * 150 = 37500次传递。现在我可以在有匹配时跳出循环,但这对我来说似乎微不足道,因为匹配也可以在列表和数据表的底部。在我的程序中,列表和表平均有2500行。那就是每n分钟传递数百万次。针说,这需要一段时间。我在一个单独的线程上运行这个计算,所以我的程序保持响应。
有没有办法使它更聪明和/或更快?我的思路对吗?
欢呼,
这个怎么样?这是更有效的,因为数据表和日期时间列表都只扫描一次,HashSet.Contains
时间复杂度为0(1)。
void Iteration()
{
//Creating and filling the datatable
DataTable dt = new DataTable();
dt.Columns.Add("Datetime", typeof(DateTime));
for (int i = 0; i < 150; i++)
{
DataRow row = dt.NewRow();
row["Datetime"] = DateTime.Now.AddDays(i);
dt.Rows.Add(row);
}
//Creating and filling the list
List<DateTime> _listDates = new List<DateTime>();
DateTime _startDate = DateTime.Now.AddMonths(-1);
for (int i = 0; i < 250; i++)
_listDates.Add(_startDate.AddDays(i));
var dateSet = new HashSet<DateTime>(_listDates);
foreach (DataRow row in dt.Rows)
{
if (dateSet.Contains( (DateTime)row["Datetime"]))
{
//Do something.........
}
}
}