Hello, I'm having troubles with the Except() method.
Instead returning the difference, it returns the original set.
I've tried by implementing the IEquatable and IEqualityComparer in the Account.
I've also tried creating a seperate IEqualityComparer class for Account.
When the Except() method is called from main, it doesn't seem to call my custom Equals() method, but when I tried Count(), it did call the custom GetHashCode() method!
I'm sure I made a trivial mistake somewhere and I hope a fresh pair of eyes can help me.
main:
-
IEnumerable<Account> everyPartnerID =
-
from partner in dataContext.Partners
-
select new Account { IDPartner = partner.ID, Name = partner.Name };
-
-
-
IEnumerable<Account> hasAccountPartnerID =
-
from partner in dataContext.Partners
-
from account in dataContext.Accounts
-
where
-
!partner.ID.Equals(Guid.Empty) &&
-
account.IDPartner.Equals(partner.ID) &&
-
account.Username.Equals("Special")
-
select new Account { IDPartner = partner.ID, Name = partner.Name };
-
-
IEnumerable<Account> noAccountPartnerID =
-
everyPartnerID.Except(
-
hasAccountPartnerID,
-
new LambdaComparer<Account>((x, y) => x.IDPartner.Equals(y.IDPartner)));
-
Account:
- public class Account : IEquatable<Account>
-
{
-
public Guid IDPartner{ get; set; }
-
public string Name{ get; set; }
-
-
/* #region IEquatable<Account> Members
-
-
public bool Equals(Account other)
-
{
-
return this.IDPartner.Equals(other.IDPartner);
-
}
-
-
#endregion*/
-
}
LambdaComparer:
- public class LambdaComparer<T> : IEqualityComparer<T>
-
{
-
private readonly Func<T, T, bool> _lambdaComparer;
-
private readonly Func<T, int> _lambdaHash;
-
-
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
-
this(lambdaComparer, o => o.GetHashCode())
-
{
-
}
-
-
public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
-
{
-
if (lambdaComparer == null)
-
throw new ArgumentNullException("lambdaComparer");
-
if (lambdaHash == null)
-
throw new ArgumentNullException("lambdaHash");
-
-
_lambdaComparer = lambdaComparer;
-
_lambdaHash = lambdaHash;
-
}
-
-
public bool Equals(T x, T y)
-
{
-
return _lambdaComparer(x, y);
-
}
-
-
public int GetHashCode(T obj)
-
{
-
return _lambdaHash(obj);
-
}
-
}