2010-05-19 18 views
4

J'ai deux façons de faire une recherche floue pour un client. L'un est par un nom abrégé et l'autre par le nom complet du client. Quand je prends ces deux ensembles de résultats, puis les unir ensemble (que j'ai lu plusieurs endroits devraient supprimer des valeurs distinctes), je reçois des doublons. Pensant que tout ce que j'ai besoin de faire est d'appeler la méthode .Distinct() à ce sujet, je reçois également des doublons. Dois-je implémenter des fonctionnalités de comparaison dans mon objet client? Mon code:LINQ to Objects .Distinct() ne tire pas d'objets distincts

 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() 

Répondre

6

Vous devez créer un comparateur d'égalité et de l'utiliser dans le Union ou 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 

Exemple d'utilisation:

Dim allMatch = shortNameMatch.Union(custNameMatch).Distinct(New MyComparer()) 
Dim allMatch = shortNameMatch.Union(custNameMatch, New MyComparer()) 
+0

qui ont secoué. J'ai pensé que j'aurais besoin de quelque chose comme ça, mais je ne l'ai pas trouvé nulle part. –

+0

Ou utilisez DistinctBy de morelinq: http://code.google.com/p/morelinq/wiki/OperatorsOverview – TrueWill

2

Union va supprimer les doublons. Si vous devez appliquer une condition autre que l'égalité de référence, transmettez un IEqualityComparer<ICustomer> en Union.