Connecting Tech Pros Worldwide Forums | Help | Site Map

[SOLVED] IEnumerable.Except() and a custom comparer

Newbie
 
Join Date: Aug 2009
Posts: 1
#1: Aug 19 '09
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:
Expand|Select|Wrap|Line Numbers
  1. IEnumerable<Account> everyPartnerID = 
  2.     from partner in dataContext.Partners
  3.     select new Account { IDPartner = partner.ID, Name = partner.Name };
  4.  
  5.  
  6. IEnumerable<Account> hasAccountPartnerID = 
  7.     from partner in dataContext.Partners
  8.     from account in dataContext.Accounts
  9.     where
  10.         !partner.ID.Equals(Guid.Empty) &&
  11.         account.IDPartner.Equals(partner.ID) &&
  12.         account.Username.Equals("Special")
  13.     select new Account { IDPartner = partner.ID, Name = partner.Name };
  14.  
  15. IEnumerable<Account> noAccountPartnerID = 
  16.     everyPartnerID.Except(
  17.         hasAccountPartnerID, 
  18.         new LambdaComparer<Account>((x, y) => x.IDPartner.Equals(y.IDPartner)));           
  19.  
Account:
Expand|Select|Wrap|Line Numbers
  1.     public class Account : IEquatable<Account>
  2.     {
  3.         public Guid IDPartner{ get; set; }
  4.         public string Name{ get; set; }
  5.  
  6. /*        #region IEquatable<Account> Members
  7.  
  8.         public bool Equals(Account other)
  9.         {
  10.             return this.IDPartner.Equals(other.IDPartner);
  11.         }
  12.  
  13.         #endregion*/
  14.     }
LambdaComparer:
Expand|Select|Wrap|Line Numbers
  1.     public class LambdaComparer<T> : IEqualityComparer<T>
  2.     {
  3.         private readonly Func<T, T, bool> _lambdaComparer;
  4.         private readonly Func<T, int> _lambdaHash;
  5.  
  6.         public LambdaComparer(Func<T, T, bool> lambdaComparer) :
  7.             this(lambdaComparer, o => o.GetHashCode())
  8.         {
  9.         }
  10.  
  11.         public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
  12.         {
  13.             if (lambdaComparer == null)
  14.                 throw new ArgumentNullException("lambdaComparer");
  15.             if (lambdaHash == null)
  16.                 throw new ArgumentNullException("lambdaHash");
  17.  
  18.             _lambdaComparer = lambdaComparer;
  19.             _lambdaHash = lambdaHash;
  20.         }
  21.  
  22.         public bool Equals(T x, T y)
  23.         {
  24.             return _lambdaComparer(x, y);
  25.         }
  26.  
  27.         public int GetHashCode(T obj)
  28.         {
  29.             return _lambdaHash(obj);
  30.         }
  31.     }
Reply