2013-10-15 10 views
6

Sto cercando di confrontare due liste con l'eccezione di metodo, ma non funziona correttamente:Confronta due liste con eccezione metodo

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

Il risultato del "risultato" variabile dovrebbe essere tutti i record di " PotentialSharedCustomers", non ci sono nella lista '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 'Salvo' è il modo corretto per risolvere questo, ma ottengo il ritorno di tutte le voci di 'PotentialSharedCustomer'

Thx per aiuto

+6

Hai sovrascritto 'Equals' e' GetHashCode' in 'Cliente'? – 2kay

+2

possibile duplicato di [LINQ Tranne operatore e uguaglianza oggetto] (http://stackoverflow.com/questions/693324/linq-except-operator-and-object-equality) –

+1

Come si confronta l'uguaglianza tra due istanze del Cliente? Se non stai facendo nulla di speciale, otterrai i risultati di un confronto di uguaglianza di riferimento. Presumo che sia necessario fornire a IEqualityComparer che determina l'uguaglianza in base al numero di conto. – Matt

risposta

7

Un modo senza sostituire Equals o la scrittura di un costume IEqualityComparer è quello di ottenere un elenco di identificatori e poi filtrare l'elenco:

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

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

Si potrebbe guardare in altre strutture di dati come HashSet per migliorare la prestazioni di ricerca, ma se la dimensione è piccola questo può essere sufficiente.

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

Sebbene questo snippet di codice possa risolvere il problema, non spiega perché o come risponda alla domanda. Per favore [includi una spiegazione per il tuo codice] (// meta.stackexchange.com/q/114762/269535), in quanto ciò aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. ** Segnalatori/revisori: ** [Per le risposte di solo codice come questa, downvote, non eliminare!] (// meta.stackoverflow.com/a/260413/2747593) – Patrick