簡體   English   中英

將vb.net數據集中的數據與數組列表中的值進行比較

[英]compare data in a vb.net dataset with values in an array list

我正在尋找一種有效的搜索數據集的方法來查看項目是否存在。 我有一個約6000項的arraylist,我需要通過比較arraylist中的每個項目與數據集的特定列中的數據來確定數據集中不存在哪些項目。

我嘗試遍歷數據集中每個項目中的每個項目,但這需要永遠。 然后我嘗試使用下面的RowFilter方法。 其中沒有一個看起來很有效率。 非常感謝任何幫助,因為你可以告訴我,我不是一個程序員......

例:

Dim alLDAPUsers As ArrayList
alLDAPUsers = clsLDAP.selectAllStudents

Dim curStu, maxStu As Integer
maxStu = alLDAPUsers.Count

For curStu = 0 To maxStu - 1
     Dim DomainUsername As String = ""
     DomainUsername = alLDAPUsers.Item(curStu).ToString

     Dim filteredView As DataView
     filteredView = dsAllStudents.Tables(0).DefaultView
     filteredView.RowFilter = ""
     filteredView.RowFilter = "szvausr_un = '" & DomainUsername & "'"

     Dim returnedrows As Integer = filteredView.Count
     If returnedrows = 0 Then
          '' Delete the user...
     End If
Next

您可以通過對列表進行排序並對數據集進行排序來獲得更好的性能。 然后你可以把它們放在一起,隨時隨地匹配。 這尤其正確,因為您可能已經在創建它的sql查詢中至少(或者您應該)對數據集進行排序,從而使該步驟基本上免費。

您應該考慮使用通用列表而不是ArrayList,以及現有代碼上的一些其他樣式點:

Dim LDAPUsers As List(Of String) = clsLDAP.selectAllStudents

For Each DomainUsername As String in LDAPUsers
     Dim filteredView As DataView = dsAllStudents.Tables(0).DefaultView
     filteredView.RowFilter = "szvausr_un = '" & DomainUsername & "'"

     If filteredView.Count = 0 Then
      '' Delete the user...
     End If
Next

這與原始代碼段完全相同,但占用空間的一半,因此更清晰,更易讀。

嘗試將陣列列表切換為Generics。 根據我的理解,它們比數組列表快得多。

這是Generics vs Array List的先前SO

如果您按照建議使用泛型,則可以使用兩個字符串列表並執行以下操作:

for each s as string in LDAPUsers.Except(AllStudents)
    ''Delete the user (s)
next

其中LDAPUsers和AllStudents都是List(Of String)

編輯:

您還可以將except更改為:

LDAPUsers.Except(AllStudents, StringComparer.InvariantCultureIgnoreCase)

忽略案例等

編輯2:

獲取通用列表可以很簡單:

Dim LDAPUsers as new List(Of String)(alLDAPUsers.Cast(Of String))
Dim AllStudents as new List(OfString)()

for each dr as DataRow in dsAllStudents.Tables(0).Rows
    AllStudents.Add(dr("szvausr_un"))
next

或者你可以像Joel提到的那樣使用Linq-y的善良,但不幸的是,我對此的曝光是有限的......

像其他人所說,仿制葯或linq將是更好的選擇。 但是,我想指出您不需要使用DataView 數據表有一個Select方法......

dsAllStudents.Tables(0).Select("szvausr_un = '" & DomainUserName & "'")

它返回一個DataRows數組。 我敢肯定它的表現和視圖一樣差,但我認為它更清潔一點。

從循環中獲取Dim語句....您的性能遭受重復變量實例化和重新分配。

同時刪除你不需要的任何語句(rowfilter =“”)

Dim alLDAPUsers As ArrayList
Dim DomainUsername As String
Dim curStu, maxStu As Integer
Dim filteredView As DataView
Dim returnedrows As Integer

alLDAPUsers = clsLDAP.selectAllStudents
maxStu = alLDAPUsers.Count

For curStu = 0 To maxStu - 1
     DomainUsername = alLDAPUsers.Item(curStu).ToString


     filteredView = dsAllStudents.Tables(0).DefaultView
     filteredView.RowFilter = "szvausr_un = '" & DomainUsername & "'"

     returnedrows  = filteredView.Count
     If returnedrows = 0 Then
          '' Delete the user...
     End If
Next

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM