2个数据表之间的差异

我有两个数据表。 DataTable dtRequired和DataTable dtResult。

我想输出一个数据表,其中包含dtResponse中不存在但在dtRequired中找到的行。

方法1我们一直在使用以下urlhttp://weblogs.sqlteam.com/davidm/archive/2004/01/19/739.aspx中指定的算法。 这个算法在我们的分析中被认为是较慢的算法之一。

方法2因此,我尝试用下面描述的内容替换上述算法。 dtRequired在我使用下面的列上索引以查找行。

if (dtResult.Rows.Count > 0) { lock (dtResult) { DataRow rowfound = null; for (int i = 0; i < dtResult.Rows.Count; i++) { DataRow row = dtResult.Rows[i]; rowfound = dtRequired.Rows.Find(new object[] { row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8] }); if (rowfound != null) { dtRequired.Rows.Remove(rowfound); } } } } 

然而,上述部分花费的时间比方法1所花费的时间长。 对于具有1250行的dtResult, 方法2需要约3秒,而对于具有4500行的dtRequired, 方法2需要约3秒。

我上面提到的方法有问题吗? 有没有更好的方法来实现这一目标?

这是指向 MSDN页面的链接 ,该页面使用LINQ to DataSet来获取两个数据表中出现的行。 此示例使用Intersect 。 我认为您可以使用除以外的方式修改它。 我不知道表现是否会更好。

 private IEnumerator GetEnumerator( DataTable dtRequired, DataTable dtResponse ) { foreach( DataRow row in dtResponse.Rows ) { // use the columns of the primary key below if( dtResult.Rows.Contains( new object[] { row[0], row[2], row[4] } ) ) continue; else yield return row.ItemArray; } } private void GetComplement( DataTable dtRequired, DataTable dtResponse, out DataTable dtResult ) { DataTable dtResult = dtRequired.Clone(); foreach( object[] items in GetEnumerator( dtRequired, dtResponse ) ) { dtResult.Rows.Add( items ); } return; } 
  1. 你说你的循环Find()方法效率低于方法1 http://weblogs.sqlteam.com/davidm/archive/2004/01/19/739.aspx

  2. 我见过人们谈论ADO.NET 3.5和LINQ,假设您有一个生产LINQ或使用迭代方法来填充一些通用容器。

  3. 我想知道HashTable的创造性使用是否恰好更快,更具计算性(现实世界,不是理论)。 在Diff(tbl1,tb2)的情况下,只需用tbl2填充哈希值,然后迭代地添加tbl1成员。 对于每次成功,还要将成员的副本添加到要显示/返回的输出(差异)数组中。 显然,对于每个失败,它已经存在,所以不要输出/返回该值。

让我知道,如果你确认3是最快的,我会修改我的代码。 我想将DirectoryServices.FindAll()Collection与SqlDataReader()进行比较,而LINQ to Active Directory则在第三方Beta中。 所以我需要一个’生产’批准的方法,尽可能高效地@ 15,000个对象。