2009-06-26 93 views
-1

我有兩個數據表。 DataTable dtRequired和DataTable dtResult。2個數據表之間的區別

我想輸出一個數據表,其中包含dtResponse中沒有但在dtRequired中找到的行。

方法1 我們一直在使用在以下url http://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所花費的時間更長。 方法2對於1250行的dtResult需要〜3秒,dt需要4500行。

我上面提到的方法有問題嗎?有沒有更好的方法來實現這一目標?

+1

如果我可能會問,爲什麼你要用dataTable做這個?這不能在後端完成嗎? – shahkalpesh 2009-06-26 05:58:44

+0

否。源數據表用於形成發送到Web服務的壓縮數據結構。 Webservice相應地解釋這些數據,然後返回數據集。 – 2009-06-26 06:17:06

+1

這兩個表是否有可以排序的唯一列?如果是這樣;您可以先對兩者進行排序,然後使用合併算法(請參見http://en.wikipedia。org/wiki/Merge_algorithm)將每個表當前行向前移動,同時將其排在另一個之後,將缺失的行插入到新表中。 – 2009-06-26 06:24:04

回答

1

這是一個使用LINQ to DataSet獲取兩個數據表中出現的行的MSDN頁面的link。此示例使用Intersect。我想你可以使用來修改它,除了。我不知道這個表現會不會更好。

0
private IEnumerator<object[]> 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; 
} 
0
  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()集合到SqlDataReader()和LINQ到Active Directory是在第三方測試版中。所以我需要一個'生產'批准的方法,儘可能高效@ 15,000個對象。