Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过大型数据表优化循环_C#_Asp.net - Fatal编程技术网

C# 通过大型数据表优化循环

C# 通过大型数据表优化循环,c#,asp.net,C#,Asp.net,我将数据表分成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 } } for(int i=0;i

我将数据表分成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
    }
}
for(int i=0;i
对于100-200行,它在几分钟内完成,这是可以的,但是将几千行与几千行进行比较,需要几个小时,而且还没有完成

我能做些什么来加速它?我想到的最好办法是使用对象列表,而不是数据表

还有其他建议吗

线程可以用来做这个吗


谢谢。

如果结果按某种顺序排序,您可以将结果放入一个数组中,并使用二进制搜索进行循环。

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

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

for (int j = i + 1; j < DT1.Rows.Count; j++)
for(int j=i+1;j
这将大大减少比较的次数。您的算法当前需要
n^2
比较。拟议的修复方案将这一数字减少到不到一半。使用此修复程序,您只需要比较(int i=0;i(n^2-n)/2
    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
      }
    }
{
对于(int j=i+1;j 例如,如果您正在查找表示具有相同名字和姓氏的用户的行,则使用自联接的简单查询将在几秒钟而不是几分钟内得到结果,因为数据永远不会离开引擎

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

假设对
FirstName
LastName
列进行了索引,此查询将很快找到重复的列。

您还可以依靠.NET内部构件来完成比手动循环更好的工作,使用:

DataTable.Select(filterExpression, sortExpression)

最近,我遇到了一个类似的场景,我必须处理它。虽然在我的例子中,我比较了一对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
    }
}
int DT1Count=DT1.Rows.Count;
对于(int i=0;i

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

这些嵌套循环的目的是什么?在加速之前,我们需要知道problem@DenisErmolin我通过简单的算法将每一行相互比较,并将结果写在另一个表中。比较每一行的目的是什么h其他行?删除重复项或某些计算?这些数据是否在同一数据库中?如果是,dbms已为此目的构建和优化(即使数据库不同,但在sql server平台上,您可以使用链接服务器功能来比较服务器上的数据)。编写一个好的存储过程需要几秒钟。如果你坚持自己编写代码,你可以考虑修改内部循环(当找到正确的记录时,你是否会中断?数据是否有序?是否可以使用二进制算法加快速度?)@jags计算字符串相似性。查找两条消息。这是SQL Server中的一个表,我按用户ID选择消息,然后将它们全部与全部进行比较(将datatable行与自身进行比较)@xyz看一看我的例子,我从同一个表中选择用户,然后将所有用户进行比较。如果您有正确的索引,SQL Server应该能够轻松击败您编写的任何内容。