IEnumerable.Except()和自定义比较(IEnumerable.Except() an

2019-10-17 08:10发布

我在与除()方法的麻烦。 而不是返回的差异,它返回原来的设置。

我已经试过落实IEquatable和的IEqualityComparer在Account类。 我也试着创建帐户一个单独的IEqualityComparer类。

当除()方法是从主叫,它似乎并没有打电话给我的自定义equals()方法,但是当我试图COUNT(),它没有调用自定义的GetHashCode()方法!

我敢肯定,我什么地方做一个简单的错误,我希望一个新的一双眼睛能帮助我。

主要:

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

帐户:

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

Answer 1:

基本上你LambdaComparer类是破碎的,当你只是一个单一的功能通过,因为它使用了“身份的散列码”供应商,如果你不提供其他任何东西。 哈希码是通过使用Except ,而这正是造成问题。

三个选项的位置:

  1. 实现自己的ExceptBy方法,然后最好将其提供给MoreLINQ包含之类的事情。

  2. 使用不同的执行IEqualityComparer<T> 我有一个ProjectionEqualityComparer类,你可以在使用MiscUtil -或者你可以使用代码,张贴在另一个问题 。

  3. 通过lambda表达式到您LambdaComparer代码,用来哈希:

     new LambdaComparer<Account>((x, y) => x.IDPartner.Equals(y.IDPartner)), x => x.IDPartner.GetHashCode()); 


Answer 2:

你也可以快速解决您的LambdaComparer当只有平等参数,这样提供给工作:

    public LambdaComparer(Func<T, T, bool> lambdaComparer) :
        this(lambdaComparer, o => 1)
    {
    }


文章来源: IEnumerable.Except() and a custom comparer