2011-11-29 19 views
10

ho due liste vedi sotto ..... risultato sta tornando come vuotoIntersezione tra due liste non funziona

List<Pay>olist = new List<Pay>(); 
List<Pay> nlist = new List<Pay>(); 
Pay oldpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 1 
}; 

olist.Add(oldpay); 
Pay newpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 100 
}; 
nlist.Add(newpay); 
var Result = nlist.Intersect(olist); 

alcun indizio perché?

+0

Supponendo che l'uguaglianza di pagamento sia ID evento, numero e importo, non c'è niente di comune in questi due elenchi e quindi nulla interseca. In altre parole, non hai definito l'uguaglianza qui. –

+0

Cosa intendi per non aver definito l'uguaglianza qui? solo un elemento diverso è Importo = 100 – user570715

+0

Non c'è niente nella domanda che afferma che _why_ 'oldpay' dovrebbe essere uguale a' newpay'. –

risposta

21

è necessario sostituire le Equals e GetHashCode metodi nella classe Pay, altrimenti Intersect non sa quando 2 istanze sono considerati uguali. Come potrebbe indovinare che è lo EventId che determina l'uguaglianza? oldPay e newPay sono istanze diverse, quindi per impostazione predefinita non sono considerate uguali.

è possibile ignorare i metodi in Pay come questo:

public override int GetHashCode() 
{ 
    return this.EventId; 
} 

public override bool Equals(object other) 
{ 
    if (other is Pay) 
     return ((Pay)other).EventId == this.EventId; 
    return false; 
} 

Un'altra opzione è quella di implementare un IEqualityComparer<Pay> e passarlo come parametro Intersect:

public class PayComparer : IEqualityComparer<Pay> 
{ 
    public bool Equals(Pay x, Pay y) 
    { 
     if (x == y) // same instance or both null 
      return true; 
     if (x == null || y == null) // either one is null but not both 
      return false; 

     return x.EventId == y.EventId; 
    } 


    public int GetHashCode(Pay pay) 
    { 
     return pay != null ? pay.EventId : 0; 
    } 
} 

... 

var Result = nlist.Intersect(olist, new PayComparer()); 
+2

oppure potresti scrivere il tuo comparatore: http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox, sì, stavo effettivamente modificando la mia risposta per menzionarlo quando hai commentato;) –

+0

Oppure puoi fare in modo che 'Pay' digiti' struct' per farlo, anche se l'implementazione predefinita è lenta perché usa il reflection. – Gebb

0

Intersect è probabilmente solo gli oggetti che aggiungono quando la stessa istanza di Pay è in entrambi List. Come oldPay e newPay sono istanziati a parte sono considerati non uguali.

Intersect utilizza il metodo Equals per confrontare gli oggetti. Se non si esegue l'override, mantiene lo stesso comportamento della classe Object: restituendo true solo se entrambi sono la stessa istanza dell'oggetto.

È necessario eseguire l'override del metodo Equals in Pay.

//in the Pay class 
    public override bool Equals(Object o) { 
     Pay pay = o as Pay; 
     if (pay == null) return false; 
     // you haven't said if Number should be included in the comparation 
     return EventId == pay.EventId; // && Number == pay.Number; (if applies) 
    } 
0

Gli oggetti sono tipi di riferimento. Quando crei due oggetti, hai due riferimenti univoci. L'unico modo che avrebbero mai confrontare uguale è se l'avete fatto:

object a = new object(); 
object b = a; 

In questo caso, (a == b) è vero. Leggi su reference vs value tipi, e objects

E per risolvere il problema, override Equals e GetHashCode, come Thomas Levesque ha sottolineato.

Problemi correlati