如果您的DataTable 中的数据不经常更改,并且您多次搜索DataTable,并且您的DataTable 包含许多行,那么构建您自己的数据可能会快很多数据的索引。
执行此操作的最简单方法是按键列对数据进行排序,以便您可以对排序列表进行二进制搜索。例如,您可以像这样构建索引:
Private Function BuildIndex(table As DataTable, keyColumnIndex As Integer) As List(Of String)
Dim index As New List(Of String)(table.Rows.Count)
For Each row As DataRow in table.Rows
index.Add(row(keyColumnIndex))
Next
index.Sort()
Return index
End Function
然后,您可以通过二分查找快速检查索引中是否存在值,如下所示:
Private Function ItemExists(index As List(Of String), key As String) As Boolean
Dim index As Integer = index.BinarySearch(key)
If index >= 0 Then
Return True
Else
Return False
End If
End Function
你也可以用一个简单的字符串数组来做同样的事情。或者,您可以使用 Dictionary 对象(它是哈希表的实现)来构建您的 DataTable 的哈希索引,例如:
Private Function BuildIndex(table As DataTable, keyColumnIndex As Integer) As Dictionary(Of String, DataRow)
Dim index As New Dictionary(Of String, DataRow)(table.Rows.Count)
For Each row As DataRow in table.Rows
index(row(keyColumnIndex)) = row
Next
Return index
End Function
然后,您可以获得与给定键匹配的DataRow,如下所示:
Dim index As Dictionary(Of String, DataRow) = BuildIndex(myDataTable, myKeyColumnIndex)
Dim row As DataRow = Nothing
If index.TryGetValue(myKey, row) Then
' row was found, can now use row variable to access all the data in that row
Else
' row with that key does not exist
End If
您可能还想研究使用SortedList 或SortedDictionary 类。这两个都是二叉树的实现。很难说所有这些选项中的哪一个在您的特定场景中最快。这完全取决于数据的类型、索引需要重建的频率、搜索的频率、DataTable 中有多少行以及您需要对找到的项目做什么。最好的办法是在测试用例中尝试每一个,看看哪一个最适合您的需要。