Нахождение четких линий в больших таблицах данных - PullRequest
1 голос
/ 06 октября 2010

В настоящее время у нас есть большой объект DataTable (~ 152 тыс. Строк), и мы делаем для каждого из них, чтобы найти подмножество различных записей (~ 124 тыс. Строк). Это в настоящее время занимает около 14 минут, что слишком долго.

Поскольку мы застряли в .NET 2.0, так как наши отчеты не будут работать с VS 2008+, я не могу использовать linq, хотя я не знаю, будет ли это быстрее, если честно.

Есть ли лучший способ найти отдельные строки (в данном случае номера счетов), отличные от этой, для каждого цикла?

Это код:

Public Shared Function SelectDistinctList(ByVal SourceTable As DataTable, _
                                          ByVal FieldName As String) As List(Of String)
    Dim list As New List(Of String)
    For Each row As DataRow In SourceTable.Rows
        Dim value As String = CStr(row(FieldName))
        If Not list.Contains(value) Then
            list.Add(value)
        End If
    Next
    Return list

End Function

1 Ответ

1 голос
/ 06 октября 2010

Использование Dictionary вместо List будет быстрее:

    Dim seen As New Dictionary(Of String, String)
    ...
        If Not seen.ContainsKey(value) Then
            seen.Add(value, "")
        End If

Когда вы ищете List, вы сравниваете каждую запись с value, поэтому к концу процесса вы делаете ~ 124K сравнений для каждой записи. A Dictionary, с другой стороны, использует хеширование для ускорения поиска.

Если вы хотите вернуть список уникальных значений, используйте seen.Keys.

(Обратите внимание, что для этого в идеале вы должны использовать тип Set, но в .NET 2.0 его нет.)

...