2013-10-15 14 views
6

Ich versuche, zwei Listen mit der Ausnahme Verfahren zu vergleichen, aber es nicht richtig funktioniert:Vergleichen Sie zwei Listen mit Ausnahme Methode

List<Customer> PotentialSharedCustomer = new List<Customer>(); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "", Name = "Hans Jürgen" }); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "05465", Name = "Beate Müller" }); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "15645", Name = "Sabine Meyer" }); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "54654", Name = "Moritz Kummerfeld" }); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "15647", Name = "Hanna Testname" }); 

List<Customer> ActualSharedCustomer = new List<Customer>(); 
ActualSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "", Name = "Hans Jürgen" }); 
ActualSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "05465", Name = "Beate Müller" }); 
ActualSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "15645", Name = "Sabine Meyer" }); 

PrepareCreateSharedCustomer(PotentialSharedCustomer, ActualSharedCustomer); 

public void PrepareCreateSharedCustomer(List<Customer> potentialSharedCustomer, List<Customer> actualSharedCustomer) 
{ 
    List<Customer> result = potentialSharedCustomer.Except(actualSharedCustomer).ToList<Customer>(); 
} 

Das Ergebnis der Variablen „result“ sollte alle Aufzeichnungen "sein PotentialSharedCustomers“gibt es nicht in der Liste "ActialSharedCustomer":

PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "54654", Name = "Moritz Kummerfeld" }); 
PotentialSharedCustomer.Add(new Customer { AccountId = Guid.Empty, AccountNumber = "15647", Name = "Hanna Testname" }); 

I thougt "Außer" ist der richtige Weg, dies zu lösen, aber ich die Rückkehr aller Elemente von get "PotentialSharedCustomer"

Thx für die Hilfe

+6

Haben Sie "Equals" und "GetHashCode" in "Customer" überschrieben? – 2kay

+2

mögliches Duplikat von [LINQ Außer Operator- und Objektgleichheit] (http://stackoverflow.com/questions/693324/linq-except-operator-and-object-equality) –

+1

Wie vergleicht man die Gleichheit zwischen zwei Instanzen des Kunden? Wenn Sie nichts Spezielles tun, erhalten Sie die Ergebnisse eines Referenzgleichheitsvergleichs. Ich nehme an, dass Sie einen IEqualityComparer bereitstellen müssen, der Gleichheit basierend auf der Kontonummer ermittelt. – Matt

Antwort

7

Eine Möglichkeit, ohne Equals zwingende oder das Schreiben eines benutzerdefinierten IEqualityComparer ist eine Liste von Identifikatoren zu bekommen und dann die Liste filtern:

List<string> accountNumbers = 
    potentialSharedCustomer.Select(c => c.AccountNumber) 
          .Except(actualSharedCustomer.Select(c => c.AccountNumber)); 

List<Customer> result = potentialSharedCustomer.Where(c => accountNumbers.Contains(c.AccountNumber)); 

Sie in anderen Datenstrukturen wie HashSet aussehen könnte das verbessern Nachschlageleistung, aber wenn die Größe klein ist, kann dies ausreichend sein.

-1
var distinctCustomer = PotentialSharedCustomer 
    .Select(p => p.AccountNumber) 
    .Except(actualSharedCustomer.Select(q => q.AccountNumber)) 
    .ToList(); 
+0

Während dieses Code-Snippet das Problem lösen kann, erklärt es nicht, warum oder wie es die Frage beantwortet. Bitte [fügen Sie eine Erklärung für Ihren Code hinzu] (// meta.stackexchange.com/q/114762/269535), da dies wirklich zur Verbesserung der Qualität Ihres Posts beiträgt. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. ** Flaggers/Reviewer: ** [Für Code-only-Antworten wie diesen, downvote, nicht löschen!] (// meta.stackoverflow.com/a/260413/2747593) – Patrick