2016-03-29 5 views
0

У меня есть список объектов, имеющих много свойств.Проверьте, есть ли список <Of List<T>> Список <T>

Dim Duplicates As New List(Of ElementObject) 
Dim ListOfDuplicates As New List(Of List(Of ElementObject)) 

For Each Element As ElementObject In Duplicates 
    Dim tmpList As List(Of ElementObject) 

    'Im looking for list of elements with the same width and height in Duplicates list 
    tmpList = Duplicates.FindAll(Function(x) x.Width = Element.Width And x.Height = Element.Height) 
    tmpList = tmpLista.OrderBy(Function(x) x.Id).ToList() 

    'Here is what I want: I want to look if tmpLista is already in ListOfDuplicates, but this code does not work 
    If ListOfDuplicates.Contains(tmpList) Then 
     Continue For 
    End If 

    ListOfDuplicates.Add(tmpList) 
Next 

Как достичь этого, чтобы проверить, содержит ли этот список еще один Список объектов?

+0

'tmpLista' в' tmpList = tmpLista.OrderBy (функция (х) x.Id) .ToList() ', кажется, опечатка. –

+0

Нет, я просто изменил имена моих переменных и забыл изменить tmpList :) – XardasLord

+0

Ваш код не может работать, так как tmpList - это вновь созданный список каждый раз, когда вы делаете чек. –

ответ

0

Это сделал трюк:

Dim Contain As Boolean = ListOfDuplicates.Any(Function(x) x.SequenceEqual(tmpList)) 
1

Вы можете использовать SequenceEqual сравнить содержимое списка с двумя оговорками:

  • списки должны быть отсортированы таким же образом
  • The объекты в списках должны быть равнозначными. Вы можете сделать это, переопределив Equals или реализуя функцию, которая проверяет равенство.

Я больше привык к этому в C#, где более легкие записи для лямбда, и я могу создать класс расширения без создания отдельного модуля. Этот класс обеспечивает вычисление и сравнение хеш-кода для проверки двух списков элементов для тех же значений. Он вычисляет набор хеш-кодов для каждого списка, сортирует хэш-коды и затем сравнивает наборы хэш-кодов с использованием SequenceEquals.

Public Class ElementListComparer 
    Public Shared Function ListsAreEqual(list1 As IEnumerable(Of Element), list2 As IEnumerable(Of Element)) 
     If list1 Is Nothing OrElse list2 Is Nothing Then Return False 
     If Object.ReferenceEquals(list1, list2) Then Return True 
     return GetSortedHashCodes(list1).sequencequal(GetSortedHashCodes(list2)) 
    End Function 

    Public Shared Function GetSortedHashCodes(elements As IEnumerable(Of Element)) 
     Return elements.Select(Function(el As Element) As Long 
            Return CalculateHashCode(el) 
           End Function).OrderBy(Function(hashcode) 
                 Return hashcode 
                End Function) 
    End Function 

    Public Shared Function CalculateHashCode(el As Element) As Long 
     Return (el.Height * 397)^el.Width 
    End Function 
End Class 

Таким образом, вы могли бы назвать

ElementListComparer.ListsAreEqual(list1 as IEnumerable(of Element), list2 as IEnumerable(of Element)) 
Смежные вопросы