LINQ to Objects .Distinct () не тянет отдельные объекты - PullRequest
4 голосов
/ 20 мая 2010

У меня есть два способа нечеткого поиска клиента. Один с сокращенным именем, а другой с полным именем клиента. Когда я беру эти два набора результатов, а затем объединяю их вместе (которые я прочитал в нескольких местах, следует удалить разные значения), я получаю дубликаты. Думая, что все, что мне нужно сделать, это вызвать метод .Distinct(), я также получаю дубликаты. Нужно ли мне реализовать некоторые функции сравнения в моем объекте заказчика? Мой код:

        Dim shortNameMatch As List(Of ICustomer) = CustomerLibrary.GetCustomersByShortName(term)
        Dim custNameMatch As List(Of ICustomer) = CustomerLibrary.GetCustomersByCustName(term)
        Dim allMatch = (From a In (From s In shortNameMatch Select s).Union(From c In custNameMatch Select c) Select a).Distinct()

Ответы [ 2 ]

6 голосов
/ 20 мая 2010

Вам необходимо создать компаратор равенства и использовать его в Union или Distinct:

Public Class MyComparer
    Implements IEqualityComparer(Of ICustomer)

    Public Overloads Function Equals(ByVal x As ICustomer, ByVal y As ICustomer) _
        As Boolean Implements _
        System.Collections.Generic.IEqualityComparer(Of ICustomer).Equals
        Return ((x.id = y.id) AndAlso (x.title = y.title))
    End Function
    Public Overloads Function GetHashCode(ByVal obj As ICustomer) _
        As Integer Implements _
        System.Collections.Generic.IEqualityComparer(Of ICustomer).GetHashCode
        Return Me.GetHashCode()
    End Function
End Class

Пример использования:

Dim allMatch = shortNameMatch.Union(custNameMatch).Distinct(New MyComparer())
Dim allMatch = shortNameMatch.Union(custNameMatch, New MyComparer())
2 голосов
/ 20 мая 2010

Union удалит дубликаты. Если вам нужно применить условие , отличное от , отличное от ссылочного равенства, передайте IEqualityComparer<ICustomer> в Union.

...