2011-11-29 23 views
10

He dos listas véase más adelante ..... resultado se está volviendo tan vacíointersección entre dos listas no trabaja

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

ninguna idea de por qué?

+0

Suponiendo que la igualdad de pago es EventID, Number, AND Amount, no hay nada en común en esas dos listas y, por lo tanto, no se cruza nada. En otras palabras, no ha definido la igualdad aquí. –

+0

¿A qué te refieres con que no se haya definido la igualdad aquí? solo elemento diferente es Amount = 100 – user570715

+0

No hay nada en la pregunta que indique _why_ 'oldpay' debe ser igual a' newpay'. –

Respuesta

21

se debe redefinir los métodos Equals y GetHashCode en su clase Pay, de lo contrario Intersect no sabe cuándo 2 casos se consideran iguales. ¿Cómo podría suponer que es el EventId el que determina la igualdad? oldPay y newPay son instancias diferentes, por lo que de forma predeterminada no se consideran iguales.

Puede reemplazar los métodos de Pay así:

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

Otra opción es implementar una IEqualityComparer<Pay> y pasarlo como parámetro a 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

o podría escribir su propio comparador: http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox, sí, en realidad estaba editando mi respuesta para mencionar esto cuando comentó;) –

+0

O puede hacer que el 'Pago' escriba una 'estructura' para que lo haga por usted, aunque la implementación predeterminada es lenta porque usa la reflexión. – Gebb

0

Intersect es probable que sólo los objetos añadiendo cuando la misma instancia de Pay está en ambos List. Como oldPay y newPay se crean instancias aparte, no se consideran iguales.

Intersect usa el método Equals para comparar objetos. Si no lo anula, conserva el mismo comportamiento de la clase Object: devuelve true solo si ambas son la misma instancia del objeto.

Debe anular el método Equals en 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

Los objetos son tipos de referencia. Cuando crea dos objetos, tiene dos referencias únicas. La única manera de que alguna vez comparar la igualdad es si lo hizo:

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

En este caso, (a == b) es verdadera. Lea sobre reference vs value tipos, y objects

y fijar su problema, y ​​es igual de anulación GetHashCode, como Thomas Levesque señaló.

Cuestiones relacionadas