将vb.net数据集中的数据与数组列表中的值进行比较

时间:2008-10-28 13:23:14

标签: asp.net sql vb.net dataset

我正在寻找一种有效的搜索数据集以查看项目是否存在的方法。我有一个约6000项的arraylist,我需要通过将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

5 个答案:

答案 0 :(得分:4)

您可以通过对列表进行排序并对数据集进行排序来获得更好的性能。然后你可以把它们放在一起,随时随地匹配。这尤其正确,因为您可能已经在创建它的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

这与原始代码段完全相同,但占用空间的一半,因此更清晰,更易读。

答案 1 :(得分:2)

尝试将阵列列表切换为Generics。根据我的理解,它们比数组列表快得多。

以下是Generics vs Array List

上的SO

答案 2 :(得分:2)

如果您按照建议使用泛型,则可以使用两个字符串列表并执行以下操作:

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的善良,但不幸的是,我对此的曝光是有限的......

答案 3 :(得分:1)

就像其他人所说的那样,仿制药或linq会是更好的选择。但是,我想指出您不需要使用 DataView 。数据表有选择方法...

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

它返回一个DataRows数组。我确信它的表现与视图一样差,但我觉得它更清洁。

答案 4 :(得分:0)

将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