Объединение двух списков, только записи с 1 конкретным уникальным свойством - PullRequest
0 голосов
/ 24 июня 2019

Я объединяю два списка в Visual Basic. Эти списки имеют пользовательский объект. Единственная запись, которую я хочу объединить, это то, что свойство со свойством не совпадает ни с одним другим объектом в списке. У меня это работает. Тем не менее, первый список просто 1,247 записей. Второй список, однако, не хватает 27.000.000 записей. В прошлый раз, когда я успешно объединил два списка с этим ограничением, это заняло более 5 часов.

Обычно я пишу код на C #. Однажды у меня была похожая проблема, и я решил ее с помощью любой функции. Работало отлично и очень быстро. Итак, как вы можете видеть в коде, я пробовал и здесь Однако это занимает слишком много времени.

Private Function combineLists(list As List(Of Record), childrenlist As List(Of Record)) As List(Of Record) 'list is about 1.250 entries, childrenlist about 27.000.000
    For Each r As Record In childrenlist
        Dim dublicate As Boolean = list.Any(Function(record) record.materiaalnummerInfo = r.materiaalnummerInfo)
        If Not dublicate Then
            list.Add(r)
        End If

    Next

    Return list
End Function

Запись объекта выглядит следующим образом (я не был уверен, как создать пользовательский объект в VB, и это выглядит плохо, но это сработало):

Public Class Record
    Dim materiaalnummer As String
    Dim type As String 'Config or prefered
    Dim materiaalstatus As String
    Dim children As New List(Of String)

    Public Property materiaalnummerInfo()
        Get
            Return materiaalnummer
        End Get
        Set(value)
            materiaalnummer = value
        End Set
    End Property
    Public Property typeInfo()
        Get
            Return type
        End Get
        Set(value)
            type = value
        End Set
    End Property
    Public Property materiaalstatusInfo()
        Get
            Return materiaalstatus
        End Get
        Set(value)
            materiaalstatus = value
        End Set
    End Property
    Public Property childrenInfo()
        Get
            Return children
        End Get
        Set(value)
            children = value
        End Set
    End Property
End Class

Я надеялся, что кто-нибудь сможет направить меня в правильном направлении, чтобы сократить необходимое время. Заранее спасибо.

1 Ответ

0 голосов
/ 24 июня 2019

Я не уверен на 100%, что вы хотите, чтобы вывод был таким, как все различия или только различия из большого списка и т. Д., Но я бы определенно попытался сделать это с LINQ! В основном sql для данных vb.net, поэтому что-то похожее на это:

Dim differenceQuery = list.Except(childrenlist)  
        Console.WriteLine("The following lines are in list  but not childrenlist")  

        ' Execute the query.  
        For Each name As String In differenceQuery  
            Console.WriteLine(name)  
        Next  

Также примечание: я бы предложил не называть один из списков списком, поскольку это плохая практика и используется в системе vb.net.

EDIT

Пожалуйста, попробуйте это, затем дайте мне знать, какие результаты вернутся.

 Private Function combineLists(list As List(Of Record), childrenlist As List(Of Record)) As List(Of Record) 'list is about 1.250 entries, childrenlist about 27.000.000

        list.AddRange(childrenlist) 'combines both lists

        Dim result = From v In list Select v.materiaalnummerInfo Distinct.ToList
'result hopefully may be a list with all distinct values.

    End Function

Или не объединяйте их, если не хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...