2010-10-06 19 views
1

目前我們有一個大型的DataTable(~152k行),並對每個數據表進行一次查找,以找到不同條目的子集(〜124K行)。目前這需要14分鐘左右的時間,這太長了。在大型數據表中查找不同的行

由於我們被困在.NET 2.0中,因爲我們的報告不會與VS 2008+一起使用,所以我不能使用linq,儘管我不知道這是否會更快公平。

有沒有更好的方法找到每個循環以外的不同行(此例中爲發票號)?

這是代碼:

Public Shared Function SelectDistinctList(ByVal SourceTable As DataTable, _ 
              ByVal FieldName As String) As List(Of String) 
    Dim list As New List(Of String) 
    For Each row As DataRow In SourceTable.Rows 
     Dim value As String = CStr(row(FieldName)) 
     If Not list.Contains(value) Then 
      list.Add(value) 
     End If 
    Next 
    Return list 

End Function 

回答

1

使用Dictionary而非List會更快:

Dim seen As New Dictionary(Of String, String) 
    ... 
     If Not seen.ContainsKey(value) Then 
      seen.Add(value, "") 
     End If 

當你搜索一個List,你比較value每個條目,所以在這個過程的最後,你正在對每條記錄進行124K比較。另一方面,另一方面,Dictionary使用散列使得查找更快。

如果要返回唯一值列表,請使用seen.Keys

(請注意,你最好使用Set型這一點,但.NET 2.0沒有之一)。

+0

這似乎已經得到它下降到低於1秒,貌似這是1巨大的瓶頸! – themaninthesuitcase 2010-10-06 10:49:12

相關問題