2008-10-28 2 views
3

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

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

ответ

2

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

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

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 

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

+0

Это отлично работало. Мне любопытно попробовать использовать генераторы и LDAPUsers. Кроме (AllStudents) и сравнивая время обработки. В общем, это был мой первый пост, и я не мог больше впечатлить. Благодаря! – cnynetadmin 2008-10-28 14:24:05

+0

Почему операция заказа всегда бесплатна? – 2008-10-28 21:21:00

+0

Когда предметы уже в порядке. – 2008-10-29 14:25:47

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 
2

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

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

Где LDAPUsers и AllStudents оба списка (Of String)

Edit:

Вы также можете изменить за исключением:

LDAPUsers.Except(AllStudents, StringComparer.InvariantCultureIgnoreCase) 

игнорировать регистр и т.д.

Edit 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 

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

1

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

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

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