我在寫一個VB.NET webforms站點,其中的一個頁面必須將一列文件加載到列表框中。它需要將所有PDF和TIF文件加載到數據庫中沒有條目的目錄中。目前我正在使用以下代碼成功完成此操作。基本上,我查詢數據庫以獲取文件名條目的數組列表,然後遍歷目錄中的每個文件,根據數組列表中的每個條目檢查其名稱,並且如果其名稱不在數組列表中,則將其添加到列表以綁定到列表框:從VB.NET中的另一個數組列表中刪除ArrayList中的項目
Dim category As String = "RFQ"
'Initialize database connection variables
Dim sql As String
Dim query As System.Data.SqlClient.SqlCommand
Dim result As System.Data.SqlClient.SqlDataReader
'Load document list from database
Dim savedfiles As New ArrayList
database.Open() 'Open connection to database
sql = "SELECT filename FROM fileheaders WHERE [category] = '" & category & "'" 'SQL query to read file header information
query = New System.Data.SqlClient.SqlCommand(sql, database) 'Create query to send to database
result = query.ExecuteReader() 'Execute query
While result.Read()
savedfiles.Add(row(result, "filename"))
End While
result.Close()
dbDocscan.Close()
'The following code section pulls all files from the current file directory.
Dim filelist = New ArrayList
Dim dir As New System.IO.DirectoryInfo(dirName) 'Get directory information
Dim files As System.IO.FileInfo() = dir.GetFiles() 'Get all files in directory
Dim file As System.IO.FileInfo
Dim i As Integer = 0
For Each file In files
If ((file.Extension Like ".pdf") Or (file.Extension Like ".tif")) And Not inArray(savedfiles, file.Name) Then
filelist.Add(file.Name) 'Add .pdf and .tif files to list of documents
End If
Next
filelist.TrimToSize()
eltFilelist.DataSource = filelist
eltFilelist.DataBind() 'Bind document list to listbox
然後inArray功能代碼:
Function inArray(arr As ArrayList, str As String) As Boolean
For Each item In arr
If TypeOf (item) Is String Then
If str = item Then
Return True
Exit Function
End If
End If
Next
Return False
End Function
這裏的問題:雖然它的工作原理,它似乎非常低效的。目錄中有大約27,000個文件,數據庫中大約有26,000個文件入口。因此,我正在檢查27,000個文件名中的每一個,並列出26,000個名稱。如果不將它變成組合問題,那就是數以百萬計的字符串匹配語句。有沒有更有效的方法去解決這個問題?
這是一個很好的問題,但我會說這是更適合[代碼審查(HTTP://codereview.stackexchange。 com /) –
我已經得到了答案,所以現在不用移動它。但CodeReview的目的與StackOverflow的目的有什麼不同? – user1978952
我想說,區分這兩者的最簡單方法是,CodeReview適用於已經可以運行(但可能需要改進)的代碼,而StackOverflow適用於尚未運行的代碼:)也就是說,可能會簡單化一點,但整齊地總結起來。我幾乎不推薦它,因爲這種問題屬於StackOverflow中仍然有效的灰色區域,但它正在擴展它。 –