2

我正在使用 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 行,它可以在几分钟内完成,这没关系,但是将几千行与几千行进行比较,需要几个小时并且还没有完成。

我该怎么做才能加快速度?我想到的最好的方法是使用对象列表,而不是数据表。

还有什么建议吗?

可以使用线程来执行此操作吗?

谢谢。

4

6 回答 6

5

我最近遇到了一个我必须解决的类似情况。虽然就我而言,我正在比较一对 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。通过将直接行计数用作循环的一部分,必须在每次迭代时重新评估它。这给程序增加了不必要的时间。如果您绝对需要有计数器,请先分配 Row 计数:

int DT1Count = DT1.Rows.Count;
for (int i = 0; i < DT1Count; i++)
{
    for (int j = 0; j < DT1Count; j++)
    {
        //some code to compare data
    }
}

这样,行数是静态的,并且将消除在每次迭代中评估行数所需的额外处理。

于 2012-11-12T21:02:43.127 回答
1

虽然您当然可以通过使用哈希表来优化您的搜索,但最好的优化是让数据库引擎为您搜索。RDBMS 引擎针对此类任务进行了优化——没有客户端优化能够击败它。您最大的缺点是必须将数据从数据库中提取到您的程序中。这是非常缓慢的。数据库引擎拥有所有数据——这是一个巨大的优势。

例如,如果您正在寻找代表具有相同名字和姓氏的用户的行,则使用自联接的简单查询将在几秒钟内而不是几分钟内为您提供结果,因为数据永远不会离开引擎。

select u1.userId, u2.userId
from User u1
join User u2 on u1.FirstName=u2.FirstName and u1.LastName=u2.LastName

假设FirstNameLastName列被索引,这个查询会很快发现你重复。

于 2012-10-11T10:44:37.917 回答
0

如果结果按某种顺序排序,您可以将结果放入数组并使用二分搜索循环

于 2012-10-11T10:41:39.527 回答
0

这里要做的最大优化如下:
目前,您将每个值比较两次。例如,在循环的第一次迭代中,您将第一行与自身进行比较,因为两个循环都从索引 0 开始。

最简单的解决方法是将内部循环更改为:

for (int j = i + 1; j < DT1.Rows.Count; j++)

这将大大减少比较次数。您的算法当前需要n^2比较。建议的修复将这个数字减少到不到一半。通过修复,您只需要(n^2 - n) / 2比较。

于 2012-10-11T10:42:43.147 回答
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
      }
    }
于 2012-10-11T10:43:47.523 回答
0

您还可以指望 .NET 内部结构比手动循环做得更好:

DataTable.Select(filterExpression, sortExpression)
于 2012-10-11T10:49:21.103 回答