Trzeba zastąpić metody Equals
i GetHashCode
w swojej klasie Pay
, inaczej Intersect
nie wie, kiedy 2 przypadki są uważane za równe. Jak można się domyślić, że jest to EventId
, który określa równość? oldPay
i newPay
są różnymi instancjami, więc domyślnie nie są uznawane za równe.
Można zastąpić metody w Pay
tak:
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;
}
Inną opcją jest wdrożenie IEqualityComparer<Pay>
i przekazać go jako parametr do 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());
Zakładając równość Pay jest identyfikatorem zdarzenia, numerem i kwotą, nie ma nic wspólnego na tych dwóch listach i dlatego nic nie przecina. Innymi słowy, nie zdefiniowałeś tutaj równości. –
Co masz na myśli, że nie zdefiniowałeś tutaj równości? tylko inny element to Kwota = 100 – user570715
Nie ma nic w pytaniu, w którym stany _why_ 'oldpay' powinny być równe' newpay'. –