Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите с реализацией IEqualityComparer / 3 сообщений из 3, страница 1 из 1
16.04.2019, 18:26
    #39802360
vladK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с реализацией IEqualityComparer
Я не специализируюсь в .Net, но в реализации SSIS пакета мне нужно сравнить две коллекции.

Нашел нужный пример, но заставить его работать не могу:
http://www.java2s.com/Code/VB/LINQ/Getalltheelementsfromthefirstarrayexceptfortheelementsfromthesecondarray.htm

Ниже он же. Проблема в том, что pets1 и pets2 трактуются как полностью различные, хотя записи в них идентичные.
Также вижу что реализованный метод Equals не вызывается вообще.

Спасибо!
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
Public Class Pet
    Public Name As String
    Public Age As Integer
End Class

Public Class ItemComparer
    Implements IEqualityComparer(Of Pet)

    Public Function Equals1(ByVal x As Pet, ByVal y As Pet) As Boolean _
        Implements IEqualityComparer(Of Pet).Equals

        If x Is y Then Return True

        If x Is Nothing OrElse y Is Nothing Then Return False

        Return (x.Age = y.Age) AndAlso (x.Name = y.Name)

    End Function

    Public Function GetHashCode1(ByVal product As Pet) As Integer _
        Implements IEqualityComparer(Of Pet).GetHashCode

        If product Is Nothing Then Return 0
        Dim hashItemName = If(product.Name Is Nothing, 0, product.Name.GetHashCode())
        Dim hashItemAge = product.Age.GetHashCode()
        Return hashItemName Xor hashItemAge
    End Function

End Class


Imports System
Imports System.Linq
Imports System.Collections.Generic
Module Module1


    Public Sub Main()

        Dim pet1 As New Pet With {.Name = "Turbo", .Age = 2}
        Dim pet2 As New Pet With {.Name = "Peanut", .Age = 8}

        Dim pets1 As New List(Of Pet)()
        pets1.Add(pet1)
        pets1.Add(pet2)

        Dim pets2 As New List(Of Pet)()
        pets2.Add(New Pet With {.Name = "Turbo", .Age = 2})
        pets2.Add(New Pet With {.Name = "Peanut", .Age = 8})
        'pets2.Add(pet1)
        'pets2.Add(pet2)

        Dim equal As Boolean = pets1.SequenceEqual(pets2)

        Console.WriteLine(equal)

        For Each DiffPet In pets1.Except(pets2)
            Console.WriteLine(DiffPet.Name & " - " & DiffPet.Age)
        Next

        Console.ReadKey()

    End Sub

End Module
...
Рейтинг: 0 / 0
16.04.2019, 18:52
    #39802368
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с реализацией IEqualityComparer
vladKТакже вижу что реализованный метод Equals не вызывается вообще.Ну ItemComparer вы создали - его же еще и применить надо при сравнении, сам по себе-то он не будет задействован. Например передать как второй аргумент для метода Except()

Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
17.04.2019, 11:01
    #39802585
vladK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с реализацией IEqualityComparer
Shocker.Pro,

Взлетело, спасибо огромное!
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите с реализацией IEqualityComparer / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]