сравнить данные в наборе данных vb.net со значениями в списке массивов - PullRequest
3 голосов
/ 28 октября 2008

Я ищу эффективный способ поиска по набору данных, чтобы увидеть, существует ли элемент. У меня есть массив из ~ 6000 элементов, и мне нужно определить, какой из них не существует в наборе данных, сравнивая каждый элемент в массиве с данными в определенном столбце набора данных.

Я попытался перебрать каждый элемент в наборе данных для каждого в массиве, но это заняло вечность. Затем я попытался использовать метод 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 ]

4 голосов
/ 28 октября 2008

Вы можете повысить производительность, отсортировав список и упорядочив набор данных. Тогда вы можете идти их вместе, совпадая по ходу. Это особенно верно, поскольку вы, вероятно, уже упорядочиваете набор данных, по крайней мере (или, должно быть,) в 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

Это то же самое, что и ваш оригинальный фрагмент, но в половине пространства, так что оно намного чище и более читаемо.

2 голосов
/ 28 октября 2008

Если вы используете дженерики, как предложено, вы можете иметь два списка строк и делать следующее:

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

Где LDAPUsers и AllStudents оба List (Of String)

Edit:

Вы также можете изменить, кроме:

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

Или вы можете пойти с добротой Linq-y, как упоминает Джоэл, но мое отношение к этому ограничено, к сожалению ...

2 голосов
/ 28 октября 2008

Попробуйте переключить ваш список массивов на Generics. Из того, что я понимаю, они намного быстрее, чем список массивов.

Вот предыдущий SO на Generics vs Array List

1 голос
/ 26 ноября 2008

Как уже говорили другие, дженерики или linq были бы лучшими вариантами. Однако я хотел бы отметить, что вам не нужно использовать DataView . У данных есть метод Выбор ...

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

Возвращает массив DataRows. Я уверен, что он будет работать так же плохо, как вид, но я думаю, что он немного чище.

0 голосов
/ 28 октября 2008

Извлеките операторы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...