我希望数据表有100到10000行,通过doyble循环比较每一行。
for (int i = 0; i < DT1.Rows.Count; i++)
{
for (int j = 0; j < DT1.Rows.Count; j++)
{
//some code to compare data
}
}
对于100-200行,它在几分钟内完成,这没关系,但比较几千行到几千行,需要几个小时才能完成。
我该怎么做才能加快速度?我最好的想法是使用对象列表而不是数据表。
还有其他任何消息吗?
可以使用线程来执行此操作吗?
感谢。
答案 0 :(得分:4)
我最近遇到了一个类似的情况,我不得不解决这个问题。虽然在我的情况下,我正在比较一对excel文件。对于我的试运行,在它运行之后,我在一侧有530行,在另一侧有459000在嵌套循环中。这大约是2.34亿次迭代。我的程序能够在大约30秒内完成它。在这种情况下我使用了foreach:
foreach (DataRow r1 in DT1.Rows) //Loop the First Source data
{
foreach (DataRow r2 in DT2.Rows) //Loop the Second Source data
{
//Comparison code here...
}
}
编辑:在循环中,作为参考点,您在循环的每次迭代中跟踪3个变量,第一个和第二个是您的计数器。第三个是主要的性能影响,DT1.Rows.Count。通过使用直接行计数作为循环的一部分,必须在每次迭代时重新计算它。这会给程序增加不必要的时间。如果你绝对要求有计数器,那么首先分配行计数:
int DT1Count = DT1.Rows.Count;
for (int i = 0; i < DT1Count; i++)
{
for (int j = 0; j < DT1Count; j++)
{
//some code to compare data
}
}
这样,行计数是静态的,并且应该删除在每次迭代时评估行计数所需的额外处理。
答案 1 :(得分:1)
尽管您可以通过使用哈希表来优化搜索,但最佳优化是让数据库引擎搜索您。 RDBMS引擎针对此类任务进行了优化 - 没有客户端优化应该能够击败它。您最大的缺点是必须将数据从数据库中提取到您的程序中。这很慢。数据库引擎拥有所有数据 - 这是一个巨大的优势。
例如,如果您要查找表示具有相同名字和姓氏的用户的行,则使用自联接的简单查询将在几秒钟而不是分钟内获得结果,因为数据永远不会离开引擎。
select u1.userId, u2.userId
from User u1
join User u2 on u1.FirstName=u2.FirstName and u1.LastName=u2.LastName
假设FirstName
和LastName
列已编入索引,此查询会发现您很快就会重复。
答案 2 :(得分:0)
如果结果按某种顺序排序,您可以将结果放入数组并使用二进制搜索循环
答案 3 :(得分:0)
这里要做的最大优化如下:
目前,您要比较每个值两次。例如,在循环的第一次迭代中,您将第一行与其自身进行比较,因为两个循环都从索引0开始。
最简单的解决方法是将内循环更改为:
for (int j = i + 1; j < DT1.Rows.Count; j++)
这将大大减少比较次数。您的算法目前需要进行n^2
次比较。建议的修复程序将此数量减少到不到一半。通过此修复,您只需进行(n^2 - n) / 2
次比较。
答案 4 :(得分:0)
for (int i = 0; i < DT1.Rows.Count; i++)
{
for (int j = i+1; j < DT1.Rows.Count; j++) //<-- starts from next row
{
//some code to compare data
}
}
答案 5 :(得分:0)
你还可以指望.NET内部工作比使用手动循环做得更好:
DataTable.Select(filterExpression, sortExpression)